热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么指针变量不可以由输入操作赋值?

#include<stdio.h>intmain(){char*str1Helloworld!;char*str2Welcome;char*
#include 

int main()
{
char *str1="Hello world!";
char *str2="Welcome";
char *str3;

printf("C or C++?\n");
scanf("%s",str3);

printf("%s\n",str1);
printf("%s\n",str2);
printf("%s\n",str3);

return 0;

}
书上说,str3是指针变量,不能由输入操作赋值,为什么不可以由输入操作赋值呢?

18 个解决方案

#1



char *str3;
//这里你申明了一个野指针而已!没有分配内存空间给它,
//没有空间存放你输入的数据的!
printf("C or C++?\n");
scanf("%s",str3);

#2


改成 char str3[28] = "";
你这个指针没有 初始化,所以编译会报错。

#3


str3是指针变量,不过就占了4个字节的内存,这个变量应该储存一个内存的首地址
楼主设想用scanf函数把字符串存入str,这么看,内存不够吧

#4


google 指针初始化

#5


引用 3 楼 u010749411 的回复:
str3是指针变量,不过就占了4个字节的内存,这个变量应该储存一个内存的首地址
楼主设想用scanf函数把字符串存入str,这么看,内存不够吧

第二句有问题,“scanf函数把字符串存入str”
当scanf的%s对应的是字符数组名(即数组首元的指针--指针常量)时,是将输入串存入字符数组
当scanf的%s对应的是字符指针变量时,是将输入串存入指针指向的存储区,
LZ的问题是指针变量没有初始化----野指针,指向的区域很有可能是不可写的,scanf函数将输入串存入指向的区域可能产生的后果是不确定的

#6


char *str3没有初始化,输入字时需要给它分配内存,利用malloc()函数。

#7


引用 2 楼 ningjingdemayi 的回复:
改成 char str3[28] = "";
你这个指针没有 初始化,所以编译会报错。
............
你的言论是不是太混乱了点
你说指针 写代码却是数组 
不初始化 也不会导致编译报错 


#8


指针当然可以通过输入赋值 

只是知道自己在做什么的人的都不会那么做而已

说不可以就略荒缪了

#9


引用 5 楼 cao_julians 的回复:
Quote: 引用 3 楼 u010749411 的回复:

str3是指针变量,不过就占了4个字节的内存,这个变量应该储存一个内存的首地址
楼主设想用scanf函数把字符串存入str,这么看,内存不够吧

第二句有问题,“scanf函数把字符串存入str”
当scanf的%s对应的是字符数组名(即数组首元的指针--指针常量)时,是将输入串存入字符数组
当scanf的%s对应的是字符指针变量时,是将输入串存入指针指向的存储区,
LZ的问题是指针变量没有初始化----野指针,指向的区域很有可能是不可写的,scanf函数将输入串存入指向的区域可能产生的后果是不确定的

多谢指点。

#10


楼主根本就没有理解指针与数组。
你char *str3没有初始化,说白了就是没有分配大小。你连大小长度都不知道咋输入,c还没有那么智能化。
另外你用的是指针,是指针!
劝你最好还是用 char str[10];
然后可以使用gets()或者使用for...scanf(),后一个基本后面是很少用的。

#11


指针没有初始化,就相当于一个野指针,没存储空间,赋值个毛线

#12


#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!

#13


犀利
引用 12 楼 zhao4zhong1 的回复:
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!

#14


12楼给的答案楼主试试回来告诉我们,坐等程序死球

#15



为什么不可以由输入操作赋值
你打算用2)或者3)中的哪个赋值
1)
char *p 
for(int i=0;i<10;i++)
 *p='1';//野指针所指内存写操作,未定义,程序崩溃!
2)char *p 

scanf("%s",p);
//输入 111,结果等同于1)野指针所指内存写操作,,未定义,程序崩溃!

3)
char *p 
scanf("%d",p) ; //由用户输入自己指定内存,野指针
*p='1'; //野指针所指内存写操作,,未定义,程序崩溃!

无论2),3)那种方式通过输入给指针赋值,都是野指针
指针必须用确定的地址初始化,才能减少野指针
问题出错,
PS:
一般是用变量地址:
char x='a';
char *p=&x;
数组名:
char a[10];

char *p= a;
或者动态分配 初始化
C,C++:
   p = malloc(10*sizeof(char));
 C++:
    p = new char('a');
    p = new char[10];
    p = new char;
或者初始化为NULL,p=NULL,这样程序可以检查指针的值,不是NULL表示所指地址有效,可以使用,NULL表示无效,放弃使用。







 

#16


学习了。

#17


引用 12 楼 zhao4zhong1 的回复:
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
如果是在linux下,该怎么做呢?

#18


引用 17 楼 zealoussnow 的回复:
Quote: 引用 12 楼 zhao4zhong1 的回复:

#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
如果是在linux下,该怎么做呢?

不知道gcc选项中有没有相应的功能。

推荐阅读
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
author-avatar
叶韵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有