C语言中一个指针问题

LM165678 2017-12-05 05:32:47
char * testX()
{
char (*c)[5];
char * p;
int i;
char cArray[5] = {'a', 'b', 'c', 'e', 'f'};
p = cArray;
printf("测试--------\n");
// c = &cArray;
for(i = 0;i < 5;i++)
{
printf("第%d个,为%c\n", i, p[i]);
}
printf("\n");
return cArray;
}
void testTestX()
{
char * p;
int i;
p = testX();
for(i = 0;i < 5;i++)
{
printf("第%d个,为%c\n", i, p[i]);
}
}

运行后:
想知道哪里的问题,抱歉,只有这么多分了
...全文
246 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
不小心变成猿 2017-12-22
  • 打赏
  • 举报
回复
引用 8 楼 u011261943 的回复:
[quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 3 楼 u011261943 的回复:] cArray 是在函数 testX()内声明的变量,当 testX()执行完之后, cArray就会被释放。 准确地说,在将cArray的所指向的地址传给p之后,整个cArray数组就被释放了。 此时,p就是一个野指针,它指向一段垃圾内存。
p不是野指针,而是已经固定的指针。内存释放但不会对p做任何修改;p指向的还是已经释放的区域。 对于野指针的定义,建议还需要看一下概念;[/quote] 指向一个已删除的对象或未申请访问受限内存区域的指针。cArray这里属于 指向一个已删除的对象。[/quote] sorry,说错了,不是cArray, p属于指向一个已删除的对象的情况。
不小心变成猿 2017-12-22
  • 打赏
  • 举报
回复
引用 7 楼 cfjtaishan 的回复:
[quote=引用 3 楼 u011261943 的回复:] cArray 是在函数 testX()内声明的变量,当 testX()执行完之后, cArray就会被释放。 准确地说,在将cArray的所指向的地址传给p之后,整个cArray数组就被释放了。 此时,p就是一个野指针,它指向一段垃圾内存。
p不是野指针,而是已经固定的指针。内存释放但不会对p做任何修改;p指向的还是已经释放的区域。 对于野指针的定义,建议还需要看一下概念;[/quote] 指向一个已删除的对象或未申请访问受限内存区域的指针。cArray这里属于 指向一个已删除的对象。
自信男孩 2017-12-11
  • 打赏
  • 举报
回复
引用 3 楼 u011261943 的回复:
cArray 是在函数 testX()内声明的变量,当 testX()执行完之后, cArray就会被释放。 准确地说,在将cArray的所指向的地址传给p之后,整个cArray数组就被释放了。 此时,p就是一个野指针,它指向一段垃圾内存。
p不是野指针,而是已经固定的指针。内存释放但不会对p做任何修改;p指向的还是已经释放的区域。 对于野指针的定义,建议还需要看一下概念;
LM165678 2017-12-10
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
这个是经典问题了:返回局部数组;只是未定义行为。 因为局部变量数组是在栈上申请空间,函数testX调用结束后会自动被释放,因此返回局部变量数组没有意义。局部数组的生命周期是从定义开始,到函数调用结束而结束; 如果想继续使用,那么通过数组定义时加static或者数组从堆上申请空间(malloc/free),这样可以改变它的生命周期。 加static后数组是在静态数据段申请空间,生命周期是从定义开始,到程序运行结束而结束; 一个是函数运行结束而结束,一个是程序运行结束而结束;
非常感谢,通俗易懂,再次谢谢,我明白了
LM165678 2017-12-10
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你的cArray是个局部变量,testX函数结束后就销毁了,这就是为什么不要返回指向局部变量的指针的原因
谢谢,我明白了
LM165678 2017-12-10
  • 打赏
  • 举报
回复
引用 3 楼 u011261943 的回复:
cArray 是在函数 testX()内声明的变量,当 testX()执行完之后, cArray就会被释放。 准确地说,在将cArray的所指向的地址传给p之后,整个cArray数组就被释放了。 此时,p就是一个野指针,它指向一段垃圾内存。
谢谢,不过我没有分了,给上面的第一个回答的了,谢谢
不小心变成猿 2017-12-05
  • 打赏
  • 举报
回复
cArray 是在函数 testX()内声明的变量,当 testX()执行完之后, cArray就会被释放。 准确地说,在将cArray的所指向的地址传给p之后,整个cArray数组就被释放了。 此时,p就是一个野指针,它指向一段垃圾内存。
paschen 2017-12-05
  • 打赏
  • 举报
回复
你的cArray是个局部变量,testX函数结束后就销毁了,这就是为什么不要返回指向局部变量的指针的原因
自信男孩 2017-12-05
  • 打赏
  • 举报
回复
这个是经典问题了:返回局部数组;只是未定义行为。 因为局部变量数组是在栈上申请空间,函数testX调用结束后会自动被释放,因此返回局部变量数组没有意义。局部数组的生命周期是从定义开始,到函数调用结束而结束; 如果想继续使用,那么通过数组定义时加static或者数组从堆上申请空间(malloc/free),这样可以改变它的生命周期。 加static后数组是在静态数据段申请空间,生命周期是从定义开始,到程序运行结束而结束; 一个是函数运行结束而结束,一个是程序运行结束而结束;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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