静态变量问题
郝斌老师说 静态变量不能跨函数使用那我
# include <stdio.h>
void f (int **);
int main (void)
{
int *p;
f(&p);
printf("%d %d", *p, *p+1);
return 0;
}
void f (int **p)
{
int a = 5;
*p = &a;
}
这样 *p+1还是能输出 6 照理不是说 a 的空间已经被释放了那我加1为什么还能等于6呢?
既然这样也行那又为什么需要 分配动态空间
我帮你加了点料,结果更奇怪了: # include <stdio.h>
void f (int **);
int main (void)
{
int *t;
f(&t);
printf("%d %d", *t, *t+1);
printf("\n第二:%p\n",*t);
return 0;
}
void f (int **p)
{
int a = 5;
printf("第一:%p\n",a);
*p = &a;
} 首先你使用的是指针变量,并不是静态变量静态变量是用static修饰,该指针地址指向变量a的地址,函数传递的是指针的指针,也就是你已经把指针指向了a。 楼上正解。 首先,这里没有静态变量啊(题目写错?)
其次,你的程序里的问题和你想表达的问题是一致的,就是一个指针指向一个已经“死亡”的变量并操作它,结果是什么。准确地说,结果是“不确定”的。也就是说,也可能对,也可能错,你这里就幸运地对了。但这样的程序是非常可怕的,比总是出错的程序可怕多了,一个程序每次都错,调试的时候很好还原错误并修改;但这个问题调试的时候不是每次都能重现错误的,所以一旦写完就非常难被发现兵改过来,所以被这个问题耍过的程序员(一般至少被耍了一星期)对这个问题都非常敏感。 这个P是指针吧好吧 仰望天上的光 发表于 2013-3-27 10:48 static/image/common/back.gif
首先,这里没有静态变量啊(题目写错?)
其次,你的程序里的问题和你想表达的问题是一致的,就是一个指针指 ...
5楼是正解,局部变量的空间如果被外层的指针指向的话是不会被收回的。 f()函数执行完后,a的内存确实被释放了,所谓的释放是指这块内存可以被其他进程使用,这块内存里的数据随时有可能被覆盖。当然,也有可能不会马上被覆盖。指针p指向a的内存,*P是取这块内存的值。如果这块没被其他进程占用,那么还是原来的数,如果被占用了,它的值将不确定。这种写法很危险,要杜绝。 小新110 发表于 2013-3-27 13:19 static/image/common/back.gif
5楼是正解,局部变量的空间如果被外层的指针指向的话是不会被收回的。
5楼说的是错的,无论有没有指针指向,局部变量都会被回收。 就是,局部变量用完就收回了! bang ni 顶顶 这是为什么呢~ 看看 谢谢:lol:
页:
[1]