下面的代码在HP UNIX或者Solaris上运行都没问题。在Linux下运行就出问题。有知道原因的吗?谢谢回答!!!gcc编译的。代码1:#include <fcntl.h>#include <stdlib.h>#include <string.h>#include <time.h>#define REPLMSG "I'm fine. This is from msgt_receiver."int fta_mrply(char *msg, int size) { char tmpChar; tmpChar = '\0'; printf("msg:%s\n",msg); printf("strlen(msg):%d\n",strlen(msg)); printf("size:%d\n",size); printf("111111\n"); tmpChar = msg[size]; printf("222222\n"); msg[size] = '\0'; printf("333333\n"); return 1;}int main(void) { int res; res = fta_mrply(REPLMSG, strlen(REPLMSG)); if (res == -1) { exit(1); } return 0;}运行结果;msg:I'm fine. This is from msgt_receiver.strlen(msg):37size:37111111222222Segmentation fault如果把main函数改成下面这样。不定义常量的msg,定义数组,就对。int main(void) { int res; char msg[10]; memset(msg,(char)NULL,sizeof(msg)); strcpy(msg,"12345678"); //strcpy(msg,"123456789012"); res = fta_mrply(msg, strlen(msg)); if (res == -1) { exit(1); } return 0;}代码2#include <stdlib.h> #include <string.h> int main(void) { int res; char * msg; msg="1234567890"; printf("111msg[5]:%s\n", &msg[5]); msg[5]='A'; printf("222msg[5]:%s\n", &msg[5]); return 0; } Linux: 111msg[5]:67890Segmentation fault HP: 111msg[5]:67890222msg[5]:A7890Solari: 111msg[5]:67890222msg[5]:A7890
char * msg; msg="1234567890"; 这样定义就相当于msg指针指向的是一个const变量,也就是说msg = “1234567890”所在的内存区域是不可写的。所以msg[5] = 'A'没有写内存的权限,所以就会报错。char *msg = "1234567890"这样定义编译器编译的时候就会把msg当做是const变量放在不可写的内存区域。#include <stdlib.h> #include <string.h> int main(void) { int res; char * msg; char msg1[] ="1234567890"; msg = msg1; printf("111msg[5]:%s\n", &msg[5]); msg[5]='A'; printf("222msg[5]:%s\n", &msg[5]); return 0; }
char * msg; msg="1234567890"; msg[5]='A' =>因为赋值给msg的值是一个常量,所以不允许改变其值(这在C中绝对是出错的)。可以这样修改就对了char msg[] ="1234567890"; msg[5]='A' 这样是没有问题的