问个关于函数内返回指针变量的问题。谢谢

summerYe 2010-05-19 09:22:27
#include<stdio.h>   
#include<stdlib.h>
int * make_array(int elem,int val) //1.是不能返回局部变量的地址还是不能返回局部变量的指针?
{
int i;
int *array = (int*) malloc(elem * sizeof(int));//这里可以直接把指针名当数组名使用
if(NULL == array)
exit(1);
for (i = 0; i < elem; i++)
array[i] = val;
return array;//这里array虽然是是一个指针,这里返回的是其值而非返回其地址,即不能返回&array,
}//2.这里函数结束后array被销毁是否意味着&array这块内存不再存且没有东西指着maolloc这块内存?还意味着其他什么东西呢?
void show_array(const int ar[], int n)
{
int r = 0;
int i = 0;
for(; i < n; i++)
printf("%3d", ar[i]);
printf("\n");

}


int main(void)
{
int * pa;
int size;
int value;
printf("enter the number of elements: ");
scanf("%d", &size);

while (size > 0)//不断地建新数组,不断试验这个程序。
{
printf("enter the initialization value: ");
scanf("%d", &value);
pa = make_array (size,value);
if(pa)
{
show_array(pa,size);
free(pa);
}
printf("enter the number of elements (<1 to quit): ");
scanf("%d",&size);
}
return 0;
}


上面有两个问题在注释里,还有两个问题3. array自身在栈上可以理解,为什么说&array在堆上呢,且栈上的指针删除了其指向的内容是不是脱钩了(即泄露了)在make_array函数里面也没看到free内存?4.这些代码有没有问题?如果有怎么修改。
...全文
145 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningnanren 2010-05-19
  • 打赏
  • 举报
回复

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

int * make_array(int elem,int val)
{
int i;
int * array = (int *) malloc(elem * sizeof(int));//这里可以直接把指针名当数组名使用,当然一级指针只能和一维数组互换使用,
//if(NULL == array)
//exit(1); //应该允许make_array返回NULL值,要不然main函数里面的"if(pa)"岂不形同虚设
if(NULL != array)
{
for(i = 0 ; i < elem ; i++)
*(array+i)= val;//要比array[i]=val;更清楚
}
return array;//这里array虽然是一个指针,这里返回的是其值而非返回其地址,即不能返回&array,因为函数返回值是指向整形的指针变量
}
/*
1.
不能返回局部变量的地址,可以返回局部指针变量的内容

2.
假设array值为34f223f1H是堆内存地址,&array值为02a18e97H是栈内存地址,函数结束后局部指针变量array被销毁,但是array的值所指向的内存空间不随函数的退出而消失,“pa = make_array (size,value);”语句执行后pa的值为34f223f1H,pa依然指向有效的malloc分配的内存空间,因为malloc函数从堆中申请的内存空间一直有效,直到由free函数释放

3.
array自身存放在栈上,就表示局部指针变量array的地址&array在栈上 ,但局部指针变量array的内容指向堆内存空间,虽然栈上的指针删除了,但是通过函数调用语句“pa = make_array (size,value);”后,通过释放内存语句“free(pa);”还是正常释放了malloc分配的内存,所以不会出现内存泄漏

4.
请楼主注重对变量或函数名的命名。起一个表里如一,言简意赅的变量名是好程序的基本要求
*/

void show_array(const int * const ar, int n)//加入传进来的数组会自动退化为指针,假如在函数内部中数组是不允许修改的,那么应该加上const关键字,方便升级维护和调试
{
//多余变量,int r = 0;
int i;
for(i = 0 ; i < n ; i++)
printf("%3d" , ar[i]);
printf("\n");
}


int main(void)
{
int * pa;
int size;
int value;
printf("enter the number of elements (<1 to quit): ");
scanf("%d" , &size);

while (size > 0)//不断地建新数组,不断试验这个程序。
{
printf("enter the initialization value: ");
scanf("%d" , &value);
pa = make_array(size , value);
if(pa)//替换为if(pa != NULL)更好
{
show_array(pa , size);
free(pa);
}
else
{
printf("No Memory!\n");
exit(1);//由于malloc分配成功的内存都已经正常释放,所以此时可以放心退出main函数
}
printf("enter the number of elements (<1 to quit): ");
scanf("%d" , &size);
}
return 0;
}
RHuniSoft 2010-05-19
  • 打赏
  • 举报
回复
子函数中申请的动态内存在函数调用完后没有释放,return array实则把申请的动态内存首地址返回了,这些内存如果你不释放,它会一直占用着
summerYe 2010-05-19
  • 打赏
  • 举报
回复
我自己回答第一个问题。返回局部变量的地址和返回'指向'局部变量的指针是一样的。但如果这个变量是一个指针变量那么就不能返回&array或是不能返回**pt.(假设pt指向array)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧