char *p; p={"abcde"};错在哪儿char *p; p="abcde";和char *p; p={"abcde"};有什么区别?为什么前一个对而后一个错?

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/15 23:34:34
char *p; p={

char *p; p={"abcde"};错在哪儿char *p; p="abcde";和char *p; p={"abcde"};有什么区别?为什么前一个对而后一个错?
char *p; p={"abcde"};错在哪儿
char *p; p="abcde";

char *p; p={"abcde"};
有什么区别?
为什么前一个对而后一个错?

char *p; p={"abcde"};错在哪儿char *p; p="abcde";和char *p; p={"abcde"};有什么区别?为什么前一个对而后一个错?
其实这两个哪个都不对,目前有的另一个回答也不对
如果你是想声明字符串并且赋值,那就声明的同时赋值
char *p="abcdef";或者char *p={"abcdef"};都可以
如果你好奇为什么,就看下面吧
首先如果你的声明是char *p; 下一个分句你对p赋值,那是在改变地址,*p才是指针指向的数据
所以第一个是相当于把一个常值字符串强制转换成了一个无符号的整型如果是32位平台
第二个报错,是因为编译器认为无法进行隐式的类型转换,{"abcde"}被认为是一个字符数组
所以你要么在声明的时候同时初始化char *p = "abcde";或者char *p={"abcde"};都可以
要么就在生命的时候明确的声明可能的存储空间char p[100];之后在赋值
个人建议你最好使用第二种方法,因为第一种的两个语句,事实上是让指针指向常值字符串
不同的编译器给这部分常值预留的空间不同,如果中间被侵占了,那执行结果有时候会很欢乐
当然最主要的还是p在往后移动的时候只要不遇到\0就可以一直访问下去,然后就是经典的缓冲区溢出错误了
另外,字符串以外的数组,多维字符串数组,这样直接的赋值方式都是不可以的