字符指针的一个奇怪问题,貌似和内存分配有关
以下程序
char* func()
{
char *ptr="abc";
//char ptr[]="abc";
return ptr;
}
main()
{
char *ptr = func();
printf("%s\n",ptr);
}
运行是没有问题的,但是假如改为注释里的那一句,运行结果就很奇怪,程序报warning C4172: returning address of local variable or temporary
这是为什么呢?
char *ptr="abc";
ptr在栈中,"abc"在文字常量区
char ptr[]="abc";
ptr在栈中,"abc"也在栈中
这应该是唯一的区别了,但是好像没有问题啊,求高手指点
[解决办法]
你分析得很对啊,栈去函数返回就没了,因为是局部变量。
[解决办法]
首先char *ptr="abc"; ptr是局部变量,但这个指针里的内容是字符串的内存地址,返回的时候是返回的“abc”的地址;而char ptr[]="abc";相当于把内存中的“abc”拷贝了一份到数组ptr中,但是,ptr是局部变量,当函数退出后,里面的内容就会销毁,然后你在main函数中访问时候就是未知的,我给你一段代码,然后输出的是地址,你看后应该会明白的
char* func()
{
char *ptr="abc";
printf("%x\n", &(ptr[0]));
char p[]="abc";
printf("%x %x\n", p, &p[0]);
printf("%x\n", "abc");
return ptr;
}
main()
{
func();
}