局部变量返回地址的错误

时间:2022-07-01 13:39:27
char * fun() 

{
    char *p =(char *)malloc(4);
    *p = 'a';
    return p;
}

int main()
{
   char *p;
   p = fun();
   putchar(p);
   return 0;

}
 

这个是什么错误?  
就算P是临时变量 返回的时候 还是原来的地址  
P= FUN();
*P指向的 还是malloc分配的地址上的值吧
P的值返回的时候会保存一份副本 在副值后才会被销毁
如果 malloc 分配的地址是Ox12345678 
返回的地址也会是一样的
P的值也会是Ox12345678 
那么 *P 还是指向 分配的地址 所在的变量

PUTCHAR 输出的  应该还是 a 吧;
为什么说 返回地址会出错了  
难道是在链式表达式中才会出错吗 比如 
A= B = P = FUN();

22 个解决方案

#1


*p = 'a';
*(p+1)='\0';//试一下

#2




int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型

#3


该回复于2010-05-04 22:47:28被版主删除

#4


LZ你应该直接输出地址值再判断,而不要用什么putchar

#5


 主程序将putchar(p);改为putchar(*p);将输出a

#6


引用 1 楼 xiaozhi_5638 的回复:
*p = 'a';
*(p+1)='\0';//试一下


puchar(*p);

#7



#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * fun()
{
  char *p =(char *)malloc(4);
 
  strcpy(p, "a");
 
  return p;
}

int main()
{
  char *p = NULL;
  p = fun();
  
// putchar(p);
  printf("%s",p);
  free(p);
  p = NULL;
  return 0;
}

#8


郁闷...俺这没编译器   
为什么说返回 P的话 会出错  一直搞不懂

#9



#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * fun()
{
  char *p =(char *)malloc(4);
 
  strcpy(p, "a");
  printf("内存地址:%ld\n\n",p) ; 
  return p;
}

int main()
{
  char *p = NULL;
  p = fun();
  
// putchar(p);
  printf("%s\n",p);
  printf("内存地址:%ld\n\n",p) ; 
  free(p);
  p = NULL;
  return 0;
}


#10


2楼和4楼正解!
main()函数中free(p);别忘了。

#11


重申一下 为什么在书里面说 返回 P 是错的  但实际上 MALLOC分配的地址还是被传递出来了 并不会因为P是临时变量 被销毁就会丢失地址 当然 如果是引用的话就会出错 但是只要是返回值不被引用就应该是无错的
 为什么在书里面说 返回 P 是错的

#12


继续~~~~~~~~~~~~

#13


你看的是什么书?书上说用malloc的不能返回?

#14


"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
  char *p =(char *)malloc(4);//p是一个局部指针变量
  *p = 'a';
  return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
  //如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。

#15


一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错

#16


引用 15 楼 artifly2000 的回复:
一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错

领教了。。。。。

#17


引用 14 楼 febbird1984 的回复:
"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
  char *p =(char *)malloc(4);//p是一个局部指针变量
  *p = 'a';
  return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
  //如果这里写成return &amp;p; 那么就是"……

也学习了~

#18


putchar(p);函数使用错误,
应该使用puts(p);或者putchar(*p)

#19


正解~~~
引用 2 楼 fox000002 的回复:
int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型

#20


学习了

#21


楼主你的指针式在fun函数内声明的,而它是存放在栈当中的,一旦退出fun函数,程序就会把它释放掉,而在这之前你把作为返回值返回了,但是它指向的空间已被释放掉了,因而会出错。你可以把指针定义为全局变量或者用按地址传值(指针或引用)。

#22


1,函数里面malloc()的资源会一直保留到free()后或是主函数结束;

2,putchar()参数问题,lz个人问题.

3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.

ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".

#1


*p = 'a';
*(p+1)='\0';//试一下

#2




int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型

#3


该回复于2010-05-04 22:47:28被版主删除

#4


LZ你应该直接输出地址值再判断,而不要用什么putchar

#5


 主程序将putchar(p);改为putchar(*p);将输出a

#6


引用 1 楼 xiaozhi_5638 的回复:
*p = 'a';
*(p+1)='\0';//试一下


puchar(*p);

#7



#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * fun()
{
  char *p =(char *)malloc(4);
 
  strcpy(p, "a");
 
  return p;
}

int main()
{
  char *p = NULL;
  p = fun();
  
// putchar(p);
  printf("%s",p);
  free(p);
  p = NULL;
  return 0;
}

#8


郁闷...俺这没编译器   
为什么说返回 P的话 会出错  一直搞不懂

#9



#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * fun()
{
  char *p =(char *)malloc(4);
 
  strcpy(p, "a");
  printf("内存地址:%ld\n\n",p) ; 
  return p;
}

int main()
{
  char *p = NULL;
  p = fun();
  
// putchar(p);
  printf("%s\n",p);
  printf("内存地址:%ld\n\n",p) ; 
  free(p);
  p = NULL;
  return 0;
}


#10


2楼和4楼正解!
main()函数中free(p);别忘了。

#11


重申一下 为什么在书里面说 返回 P 是错的  但实际上 MALLOC分配的地址还是被传递出来了 并不会因为P是临时变量 被销毁就会丢失地址 当然 如果是引用的话就会出错 但是只要是返回值不被引用就应该是无错的
 为什么在书里面说 返回 P 是错的

#12


继续~~~~~~~~~~~~

#13


你看的是什么书?书上说用malloc的不能返回?

#14


"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
  char *p =(char *)malloc(4);//p是一个局部指针变量
  *p = 'a';
  return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
  //如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。

#15


一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错

#16


引用 15 楼 artifly2000 的回复:
一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错

领教了。。。。。

#17


引用 14 楼 febbird1984 的回复:
"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
  char *p =(char *)malloc(4);//p是一个局部指针变量
  *p = 'a';
  return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
  //如果这里写成return &amp;p; 那么就是"……

也学习了~

#18


putchar(p);函数使用错误,
应该使用puts(p);或者putchar(*p)

#19


正解~~~
引用 2 楼 fox000002 的回复:
int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型

#20


学习了

#21


楼主你的指针式在fun函数内声明的,而它是存放在栈当中的,一旦退出fun函数,程序就会把它释放掉,而在这之前你把作为返回值返回了,但是它指向的空间已被释放掉了,因而会出错。你可以把指针定义为全局变量或者用按地址传值(指针或引用)。

#22


1,函数里面malloc()的资源会一直保留到free()后或是主函数结束;

2,putchar()参数问题,lz个人问题.

3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.

ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".