C语言 指针字符串 , char * msg; msg="1234567890"; msg[5]='A' Linux运行不对,HP,Solaris运行对。

下面的代码在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

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;
}

参考资料:http://baike.baidu.com/view/1065598.htm

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-01
char * msg; msg="1234567890"; msg[5]='A'

=>因为赋值给msg的值是一个常量,所以不允许改变其值(这在C中绝对是出错的)。

可以这样修改就对了
char msg[] ="1234567890"; msg[5]='A'

这样是没有问题的

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网