下面的代码在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):37
size:37
111111
222222
Segmentation 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]:67890
Segmentation fault
HP:
111msg[5]:67890
222msg[5]:A7890
Solari:
111msg[5]:67890
222msg[5]:A7890
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;
}
=>因为赋值给msg的值是一个常量,所以不允许改变其值(这在C中绝对是出错的)。
可以这样修改就对了
char msg[] ="1234567890"; msg[5]='A'
这样是没有问题的