读书人

关于指针的一个有关问题?他有小弟我

发布时间: 2012-03-08 13:30:13 作者: rapoo

关于指针的一个问题?他有,我有,你有木有?
直接给出2段程序吧,今天复习C突然敲了一些代码,

发现了自己对这2段程序结果,表示不懂啊。悲剧!

////////////////////////////////////////////////////
#include <stdio.h>

void change(char *p)
{
printf("%c\n", p[0]);

p[0] = 'd';
printf("%s\n", p);
}

int main()
{
char a[] = "C language";

change(a);

printf("%s\n", a);

return 0;
}

///////////////////////////////////////////////
#include <stdio.h>

void unchange(char *p)
{
printf("%c\n", p[0]);

p[0] = 'd';
printf("%s\n", p);
}

int main()
{
char *a = "C language";

unchange(a);

printf("%s\n", a);

return 0;
}

//////////////////////////////////////////////////
你看看这两段程序的结果分别是什么(别用编译器哦)?

如果不知道再用编译器复制过去看看结果。

在这里我想问前辈,为什么会出现这样的结果?


[解决办法]
http://www.cnblogs.com/guyan/archive/2011/12/23/2299179.html

char *a = "C language";
p[0] = 'd';

不允许修改 详细见链接
[解决办法]
第二个会直接崩溃。。。因为char *a = "C language";这样定义是定义了一个不可改变的变量,他被存在了一个不可更改的内存中,所以不能改变这个的内容
[解决办法]
#pragma comment(linker,"/SECTION:.rdata,RW")
加这句可以让常量内存区可写。
[解决办法]
引用:
这段程序被编译后运行时字符串"C language"会被放在代码区段,而变量a是在栈里。你要改变a的值不会有什么问题,但你要改变它目前所指位置上的值就不行,因为它指向了操作系统不让你更改的代码区段。

这段程序被编译后运行时字符串"C language"会被放在只读数据段,而变量a是在栈里。你要改变a的值不会有什么问题,但你要改变它目前所指位置上的值就不行,因为它指向了操作系统不让你更改的只读数据段。

读书人网 >C语言

热点推荐