Black_Silence 发表于 2013-3-26 21:19:19

静态变量问题

郝斌老师说 静态变量不能跨函数使用

那我
# 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呢?
既然这样也行那又为什么需要 分配动态空间

志鹏最帅 发表于 2013-3-26 22:59:09

我帮你加了点料,结果更奇怪了:

志鹏最帅 发表于 2013-3-26 22:59:40

# 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;
}

dwlsxj 发表于 2013-3-27 08:17:52

首先你使用的是指针变量,并不是静态变量静态变量是用static修饰,该指针地址指向变量a的地址,函数传递的是指针的指针,也就是你已经把指针指向了a。

1971827035 发表于 2013-3-27 09:14:52

小亮1201 发表于 2013-3-27 09:18:08

楼上正解。

仰望天上的光 发表于 2013-3-27 10:48:44

首先,这里没有静态变量啊(题目写错?)
其次,你的程序里的问题和你想表达的问题是一致的,就是一个指针指向一个已经“死亡”的变量并操作它,结果是什么。准确地说,结果是“不确定”的。也就是说,也可能对,也可能错,你这里就幸运地对了。但这样的程序是非常可怕的,比总是出错的程序可怕多了,一个程序每次都错,调试的时候很好还原错误并修改;但这个问题调试的时候不是每次都能重现错误的,所以一旦写完就非常难被发现兵改过来,所以被这个问题耍过的程序员(一般至少被耍了一星期)对这个问题都非常敏感。

a65464587 发表于 2013-3-27 13:04:31

这个P是指针吧好吧

小新110 发表于 2013-3-27 13:19:05

仰望天上的光 发表于 2013-3-27 10:48 static/image/common/back.gif
首先,这里没有静态变量啊(题目写错?)
其次,你的程序里的问题和你想表达的问题是一致的,就是一个指针指 ...

5楼是正解,局部变量的空间如果被外层的指针指向的话是不会被收回的。

玩酷子弟lv 发表于 2013-3-27 16:46:28

f()函数执行完后,a的内存确实被释放了,所谓的释放是指这块内存可以被其他进程使用,这块内存里的数据随时有可能被覆盖。当然,也有可能不会马上被覆盖。指针p指向a的内存,*P是取这块内存的值。如果这块没被其他进程占用,那么还是原来的数,如果被占用了,它的值将不确定。这种写法很危险,要杜绝。

仰望天上的光 发表于 2013-3-27 20:54:58

小新110 发表于 2013-3-27 13:19 static/image/common/back.gif
5楼是正解,局部变量的空间如果被外层的指针指向的话是不会被收回的。

5楼说的是错的,无论有没有指针指向,局部变量都会被回收。

沉思者 发表于 2013-3-28 00:03:51

就是,局部变量用完就收回了!

网站 发表于 2013-3-28 13:44:40

bang ni 顶顶

a65464587 发表于 2013-3-28 13:51:10

这是为什么呢~

阔怀 发表于 2015-8-25 10:35:30

看看

dabaojian 发表于 2015-8-25 12:41:02

谢谢:lol:
页: [1]
查看完整版本: 静态变量问题