{
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';//试一下
*(p+1)='\0';//试一下
#2
int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型
#3
#4
LZ你应该直接输出地址值再判断,而不要用什么putchar
#5
主程序将putchar(p);改为putchar(*p);将输出a
#6
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的话 会出错 一直搞不懂
为什么说返回 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);别忘了。
main()函数中free(p);别忘了。
#11
重申一下 为什么在书里面说 返回 P 是错的 但实际上 MALLOC分配的地址还是被传递出来了 并不会因为P是临时变量 被销毁就会丢失地址 当然 如果是引用的话就会出错 但是只要是返回值不被引用就应该是无错的
为什么在书里面说 返回 P 是错的
为什么在书里面说 返回 P 是错的
#12
继续~~~~~~~~~~~~
#13
你看的是什么书?书上说用malloc的不能返回?
#14
"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
char *p =(char *)malloc(4);//p是一个局部指针变量
*p = 'a';
return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
//如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。
char * fun()
{
char *p =(char *)malloc(4);//p是一个局部指针变量
*p = 'a';
return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
//如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。
#15
一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错
#16
领教了。。。。。
#17
也学习了~
#18
putchar(p);函数使用错误,
应该使用puts(p);或者putchar(*p)
应该使用puts(p);或者putchar(*p)
#19
正解~~~
#20
学习了
#21
楼主你的指针式在fun函数内声明的,而它是存放在栈当中的,一旦退出fun函数,程序就会把它释放掉,而在这之前你把作为返回值返回了,但是它指向的空间已被释放掉了,因而会出错。你可以把指针定义为全局变量或者用按地址传值(指针或引用)。
#22
1,函数里面malloc()的资源会一直保留到free()后或是主函数结束;
2,putchar()参数问题,lz个人问题.
3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.
ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".
2,putchar()参数问题,lz个人问题.
3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.
ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".
#1
*p = 'a';
*(p+1)='\0';//试一下
*(p+1)='\0';//试一下
#2
int putchar ( int character ); // 注意类型要匹配,p 的类型是char *, *p 才是 char 类型
#3
#4
LZ你应该直接输出地址值再判断,而不要用什么putchar
#5
主程序将putchar(p);改为putchar(*p);将输出a
#6
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的话 会出错 一直搞不懂
为什么说返回 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);别忘了。
main()函数中free(p);别忘了。
#11
重申一下 为什么在书里面说 返回 P 是错的 但实际上 MALLOC分配的地址还是被传递出来了 并不会因为P是临时变量 被销毁就会丢失地址 当然 如果是引用的话就会出错 但是只要是返回值不被引用就应该是无错的
为什么在书里面说 返回 P 是错的
为什么在书里面说 返回 P 是错的
#12
继续~~~~~~~~~~~~
#13
你看的是什么书?书上说用malloc的不能返回?
#14
"局部变量返回地址的错误"是指"不能返回局部变量的地址(c++中还包括引用)"而不是"不能返回局部指针变量"
char * fun()
{
char *p =(char *)malloc(4);//p是一个局部指针变量
*p = 'a';
return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
//如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。
char * fun()
{
char *p =(char *)malloc(4);//p是一个局部指针变量
*p = 'a';
return p;//这里返回的是"局部变量的值"而不是"局部变量的地址"
//如果这里写成return &p; 那么就是"返回局部变量p的地址",那么就是错的
}
虽然指针变量是用来存储地址值的,但是"指针变量"和"地址"是两码事。
#15
一般书上会说:函数返回局部变量的地址是错误的
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错
但是你这个返回的不是局部变量的地址,你返回的p是malloc分配出来的内存的地址
所以你的程序返回值没错
#16
领教了。。。。。
#17
也学习了~
#18
putchar(p);函数使用错误,
应该使用puts(p);或者putchar(*p)
应该使用puts(p);或者putchar(*p)
#19
正解~~~
#20
学习了
#21
楼主你的指针式在fun函数内声明的,而它是存放在栈当中的,一旦退出fun函数,程序就会把它释放掉,而在这之前你把作为返回值返回了,但是它指向的空间已被释放掉了,因而会出错。你可以把指针定义为全局变量或者用按地址传值(指针或引用)。
#22
1,函数里面malloc()的资源会一直保留到free()后或是主函数结束;
2,putchar()参数问题,lz个人问题.
3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.
ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".
2,putchar()参数问题,lz个人问题.
3,这里传出的p严格意义是没有问题的,因为就算是副本,但是一你有资源,二你知道他们再哪(地址),三你知道资源大小,所以这个就是合法的.
ps:我个人觉得他说的"有误"是因为大家所强调的一条公认原则"如果程序员可以在同一块代码中申请和释放内存,内存管理是最为轻松".