新手请教关于函数和指针问题

snake19853100 2012-07-10 01:42:20
void f(char**p)
{
char a='M';
*p=&a;
}
int main(void)
{
char*string=NULL;
f(&string);
printf("%c",*string);
system("Pause");
return 0;
}
运行后会print出“M”,我想问一下,声明的函数在执行完以后函数内部的a应该不存在了吧?如果不存在的话那string指向的内存为何还能显示出声明的函数内部的“M”?
...全文
143 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
彭家老三 2012-07-10
  • 打赏
  • 举报
回复
a被释放只是说那块内存你不再使用,可以被其他程序使用了,但不是说那块内存里的东西也被清除了。
snake19853100 2012-07-10
  • 打赏
  • 举报
回复
是不是最好还是不要这么写代码啊?会不会对程序引起不可知的问题?
snake19853100 2012-07-10
  • 打赏
  • 举报
回复
是不是最好还是不要这么写代码啊?会不会对程序引起不可知的问题?
snake19853100 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:

我还是没明白啊,声明的函数执行完了以后内部的变量a应该不存在了吧?那最后显示结果可以用*string打印出"M",那请问这个字符"M"到底存放在那个块内存?string指向哪块内存?应该不是指向内部变量a吧?

函数执行完成后,相应申请的堆栈会释放。但堆栈的释放只是esp和ebp的值发生变化,并不会主动去清空堆栈里的值。你的代码中,局部变量a虽然已经是脏数据,但值……
[/Quote]
确实,再次printf时输出是个空白符。
欧阳春晖 2012-07-10
  • 打赏
  • 举报
回复
这种行为是未定义的,楼主还可以输出正确值,是因为这个时候该内存地址还未被修改
nyuhua 2012-07-10
  • 打赏
  • 举报
回复
因为你把a的值给了形参p,而形参值传给了实参string,你最后输出是实参string的值吧,所以能显示出M值
W170532934 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

我还是没明白啊,声明的函数执行完了以后内部的变量a应该不存在了吧?那最后显示结果可以用*string打印出"M",那请问这个字符"M"到底存放在那个块内存?string指向哪块内存?应该不是指向内部变量a吧?

函数执行完成后,相应申请的堆栈会释放。但堆栈的释放只是esp和ebp的值发生变化,并不会主动去清空堆栈里的值。你的代码中,局部变量a虽然已经是脏数据,……
[/Quote]
++
bluesnail1986 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我还是没明白啊,声明的函数执行完了以后内部的变量a应该不存在了吧?那最后显示结果可以用*string打印出"M",那请问这个字符"M"到底存放在那个块内存?string指向哪块内存?应该不是指向内部变量a吧?
[/Quote]
函数执行完成后,相应申请的堆栈会释放。但堆栈的释放只是esp和ebp的值发生变化,并不会主动去清空堆栈里的值。你的代码中,局部变量a虽然已经是脏数据,但值确实还在。如果想验证,可以在printf之后再printf一次,可能结果就不一样了....
snake19853100 2012-07-10
  • 打赏
  • 举报
回复
我还是没明白啊,声明的函数执行完了以后内部的变量a应该不存在了吧?那最后显示结果可以用*string打印出"M",那请问这个字符"M"到底存放在那个块内存?string指向哪块内存?应该不是指向内部变量a吧?
IVERS0N 2012-07-10
  • 打赏
  • 举报
回复
只能说函数退出后 栈上的数据还没被覆盖

你在printf("%c",*string);之前随便写个语句估计结果就不一样了
hnzmdzcm 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
C/C++ code


#include <stdio.h>

void f(char** p)
{
char a = 'f';
*p = &a;
}
void tf(int** p)
{
int a = 10;
*p = &a;[color=#FF0000][size=11px],貌似取局部变量a的地址把地址赋给一个新的指针和下……
[/Quote]
函数t和函数tf的效果是一样的
hnzmdzcm 2012-07-10
  • 打赏
  • 举报
回复


#include <stdio.h>

void f(char** p)
{
char a = 'f';
*p = &a;
}
void tf(int** p)
{
int a = 10;
*p = &a;,貌似取局部变量a的地址把地址赋给一个新的指针和下面的直接赋值效果一样
}
void t(int* p)
{
int a = 10;
*p = a;
}
int main(void)
{
char* string = NULL;
f(&string);
printf("%c\n", *string);
int *i = 0;
tf(&i);
printf("%d\n", *i);
int p = 100;
int *o = &p;
t(o);
printf("%d\n", *o);
return 0;
}


69,368

社区成员

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

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