【问题标题】:malloc function in c?c语言中的malloc函数?
【发布时间】:2019-10-25 12:22:37
【问题描述】:

我无法理解以下程序输出的原因

#include <stdio.h>
#include <stdlib.h>
int main(){
int* ip = (int*)malloc(100*sizeof(int));
if (ip){
int i;
for (i=0; i < 100; i++)
  ip[i] = i*i;
}
free(ip);
int* ip2 = (int*)malloc(10*sizeof(int));
printf("%d\n", ip[5]);
printf("%d\n", ip2[5]);
ip[5] = 10;
printf("%d\n", ip2[5]);
return 0;
}

输出显示 ip & ip2 在堆中将具有相同的引用。 当我们分配一个 100 int in(ip2) 时,它是如何为 ip1 返回相同的引用的。 它是 malloc 函数的一个特性吗? 我知道 malloc 像“新”一样工作,对吗? 如果是,那么它应该返回一些随机引用,对吧?

【问题讨论】:

  • 拥有ip后使用ip的行为是未定义的。

标签: c malloc


【解决方案1】:

您的所有输出都是未定义的行为,因此它们不代表任何内容:

printf("%d\n", ip[5]);  // ip was freed, so the memory it points to may not be accessed
printf("%d\n", ip2[5]); // reading uninitialized memory
ip[5] = 10;             // writing to freed memory
printf("%d\n", ip2[5]); // still reading uninitialized memory

通常,ip2 完全有可能获得与ip 相同的地址。但是你没有在你的代码中测试它。例如,您可以这样做:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* ip = (int*)malloc(100 * sizeof(int));
    printf("%p\n", ip);
    free(ip);
    int* ip2 = (int*)malloc(100 * sizeof(int));
    printf("%p\n", ip2);
    free(ip2);
}

当我运行它时,我确实得到了两次相同的地址(但不能保证会发生这种情况)。

【讨论】:

    【解决方案2】:

    我真的不明白你的问题是什么。

    这完全取决于它分配返回给您的内存的库。特别是,它可能会或可能不会使用最近释放的内存块,只要它仍然是空闲的。

    您的第一个 malloc() 保留一些内存,您写入它然后释放它。

    您的第二个malloc() 保留一些内存,您从中读取然后释放它。

    您在第二步中阅读的内容完全是任意的,只是巧合,与您在第一步中写的相同。

    您的代码还显示了未定义的行为,因为不允许您在 free(it) 之后访问 ip[5]

    【讨论】:

      【解决方案3】:

      这是您不应该依赖的未定义行为。当您通常从页面内存分配内存时,当您释放它时不会立即将其释放到操作系统,并且当您再次尝试分配时,您很可能会得到相同的缓存中的热点。典型的 OS 内存单元在下一次迭代中以 LIFO 方式从相同的内存释放块分配相同的大小。

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 2011-10-12
        • 2016-08-19
        • 2015-09-15
        • 1970-01-01
        相关资源
        最近更新 更多