首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符指针的一个奇怪有关问题,貌似和内存分配有关

2013-07-08 
字符指针的一个奇怪问题,貌似和内存分配有关以下程序char* func(){char *ptrabc//char ptr[]abcre

字符指针的一个奇怪问题,貌似和内存分配有关
以下程序
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();
}  

[解决办法]
char ptr[]="abc";
ptr在栈中,出了栈就无效了。

[解决办法]
给初学者很好的例子!感谢楼主
[解决办法]
不要返回指向 stack 的指针
[解决办法]
2楼正解,飘过。
[解决办法]
char* func()
{
  char *ptr="abc";
  return ptr;
}
这种虽然能工作,但是不好。如果在函数外修改了func的返回值,会崩溃的。

char* func()
{
  char ptr[]="abc";
  return ptr;
}
这种对大多数编译器都不能正常工作。

建议:
const char* func()
{
  const char *ptr="abc";
      
  return ptr;
}

[解决办法]
函数一返回,栈中的东西就没了。。返回一个指向释放了的对象的指针没有意义。。
[解决办法]
引用:
你分析得很对啊,栈去函数返回就没了,因为是局部变量。

//char ptr[]="abc";函数执行完毕后,它的栈帧就出栈了,你再返回栈帧中的局部变量的地址就没用了.而且这个地址会指向未知的内存区.
[解决办法]
static char *ptr="abc";/*将ptr该为静态变量*/(相当于全局变量)也行啊

热点排行