问题描述
void main(){char *str = "china";printf("%cn",str[1]);//*(str+1) = *(str+2); // 在vc6.0下运行时出错,不明白是什么原因puts(str);}在winTc下是没问题的,在vc6.0下编译和链接都没问题,但是运行的时候,注释的那行出错了,不明白是什么原因,请各位给个提示,谢谢! 问题补充:563412561 写道
解决方案
嗯,以下是我的理解: 因为创建数组是不会共享同一个内存空间的!所以即使数组内容一样,也不会存储在同一空间中,除非你刻意赋值!我上面举得例子是:char *x = "xxxxxx"这样的声明,是会共享同一个内存空间,说得明白一点是,举个例子:char *ptr = "chinc" ;char *ptr1 = "chinc" ;printf("%d,%dn",ptr,ptr1) ;printf("%dn",&"chinc") ; 上面输出地值是全部相同的,意思是chinc这个字面字符串就是可以被共享的!下次再出现这个字面字符串时就不用再创建了!就直接到指定的内存中读取就可以!但对于数组却不会,这点你可以自己做实验。 额,可能说的不太明白,呵呵,也许是我的水平有限!!
解决方案二:
应该是分配内存的问题,有些内存是不可写的,比如有些游戏内存是不可读的。举个例子: 在用char *x = "xxxxxx"创建C风格字符串时,会在存储区域创建一个已结尾的xxxxxx存储空间,而且将x指向它的首地址,比如首地址是1,那么这个空间还在使用的时候,X指向的内容就不能被改变!,比如像你上面的那个例子*(str+1)是一个值来的,把*(str+2]的值赋给它是错误的,比如str[1]='c'同样是一样的错误。总之: 声明的字符串“china”正在被指向,所以这个区域内的内容暂时不能被改变~~这是本人的理解,不知对否!!