【发布时间】:2012-06-24 15:33:41
【问题描述】:
最近我偶然发现了源代码,其中程序员根据 if/else 条件在一个无限循环中声明变量。我发现奇怪的是代码运行并且它没有暗示任何内存泄漏。首先,我认为这可能是特定于架构的东西(代码是针对 ARM 的),但我进行了一些测试,发现使用 GCC 编译的 IA32 上的二进制文件的行为方式相同。
我的做法是这样的:我创建了两个小程序 foo.c 和 bar.c
Foo.c:
#include <stdio.h>
int main(void)
{
int i;
for(i=0; i<10; i++) {
char buf[10];
buf[i] = 0;
printf("buf[%d] (@ %#x) == %d\n", i, &buf, buf[i]);
}
return(0);
}
Bar.c:
#include <stdio.h>
int main(void)
{
int i;
for(i=0; i<10; i++) {
char *ptr;
ptr = (char *) malloc(10);
ptr[i] = 0;
printf("buf[%d] (@ %#x) == %d\n", i, &ptr, ptr[i]);
}
return(0);
}
在 Foo.c 中声明数组和在 Bar.c 中分配内存之间做出明确区分的原因是首先我认为编译器可能会自动检测到它是同一个变量,只是忽略了初始 for 迭代后的声明,这在 Bar.c 中当然不应该是这种情况,因为我明确分配了内存。
对我来说真正奇怪的是,在两个示例中,数组和分配内存的地址在初始 for 迭代后保持不变。
我不完全理解这一点,并且我没有我的 K&R 副本,所以我会感谢你的解释。 (另外,如果我的推理有任何错误,我会很高兴指出这一点。)
【问题讨论】:
-
C++ 和 C 是不同的语言,你不知道吗?而
return不是函数... -
@andy,请用英文写。
-
如果他们想回答 C 问题,他们会订阅 C 标签。使用不适当的标签来引起对您的问题的更多关注被认为是粗鲁的。
-
@Andy:没有。 C 和 C++ 是不同的语言。而且你不应该转换 malloc() 的返回值,你应该
#include <stdlib.h> -
@andy 在 C 中,你不需要强制转换,这是一种糟糕的风格。在 C++ 中,您必须这样做(但无论如何都应该很少使用
malloc)。不同语言。 非常不同。
标签: c memory-management compiler-construction memory-leaks