gpt4 book ai didi

c - 循环内的变量和分配

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:27 25 4
gpt4 key购买 nike

最近我偶然发现源代码,其中程序员根据 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);
}

条形图:

#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 的副本,因此非常感谢您的解释。 (另外,如果我在推理中犯了任何错误,我很乐意指出。)

最佳答案

不要打印指针 ptr 的地址(这是循环内的常量,因为 ptr 是当前调用帧中的局部变量),但打印指针本身:

 printf ("buf[%d] == %d, ptr == %p\n", i, ptr[i], (void*) ptr);

(请记住,如果 a 是一个数组,您确实有 &a == a 并且它们的类型是兼容的,但是如果 p 是一个指针,你通常没有&p == p,它们的类型不兼容)

当然,如果您在循环内malloc 某个指针,您通常希望在循环体末尾释放 该指针。

您应该学习使用 gcc -Wall -g 进行编译(在 Linux 上,甚至可能还使用 -Wextra)并使用调试器 gdb(在 Linux 上)。

valgrind是 Linux 上捕获内存泄漏的有用工具。你可以使用 Boehm's conservative garbage collector “避免”它们(通过使用 GC_malloc 而不是 malloc,并且不为 free 显式内存打扰)。

关于c - 循环内的变量和分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com