回复 7楼 kan月
在单位的电脑编译失败,在家里的电脑就能编译通过,不了解为什么。
1、为什么int 整形 可以成立?程序中赋的可都是字符。
答:int ArrayName[5];
/*可以替换上一行代码*/
ArrayName[0]="WangJiasheng";
/*为数组元素赋值*/
数组ArrayName的元素是int型的,"WangJiasheng"是字符串常量,是放在内存常量区,有地址的,这种ArrayName[0]="WangJiasheng"; 错误的用法是把字符串常量“WangJiasheng”的地赋给了ArrayName[0],恰恰下面继续用这种printf("%s\n",ArrayName[index]);错误的用法把ArrayName[index]指向的东西打印出来了。可以做这个实验验证一下:
int ArrayName[5];
/*可以替换上一行代码*/
char *p="WangJiasheng";
ArrayName[0]="WangJiasheng";
/*为数组元素赋值*/
printf("ArrayName[0] is %s\n",ArrayName[0]);
printf("ArrayName[0] address is 0x%x\n",ArrayName[0]);
printf("p is %s\n",p);
printf("p address is 0x%x\n",p);
p和ArrayName[0]按%s打印出来都是WangJiasheng,p和ArrayName[0]按照数值%d打印出来都是“WangJiasheng”的内存地址。
2、char * ArrayName[5] 可成立, char ArrayName[5] 却不能成立为什么?
答:char * ArrayName[5] 是一个有5个指针的数组,每个指针是指向一个字符串。所以用它来接收5个字符串("WangJiasheng")正好
char ArrayName[5] 是一个有5个字符的数组,每个元素是char型取值范围在-128~127直接,,"WangJiasheng"是字符串常量,是放在内存常量区,有地址的,但这个地址一般都挺大的,用char型强型接收它会截断,而这个很小的内存地址一般是留给Os的,不允许操作。所以在windows下报“该内存不能为read”,在linux下一般就是报段错误“Segment fault”。可以用下面的代码验证一下:
char ArrayName[5];
/*可以替换上一行代码*/
char *p="WangJiasheng";
ArrayName[0]="WangJiasheng";
/*为数组元素赋值*/
printf("ArrayName[0] address is 0x%x\n",ArrayName[0]);
printf("p address is 0x%x\n",p);