【问题标题】:Confusion over successfully writing to unallocated memory with malloc(); [duplicate]对使用 malloc() 成功写入未分配内存感到困惑; [复制]
【发布时间】:2019-11-12 21:10:11
【问题描述】:

我创建了一个简单的程序,它有一个结构node,它只包含一个int id。在main() 中,我创建了一个节点指针array,并使用malloc(sizeof(struct node)*3) 为三个struct node 分配空间。然后我让这三个指针指向节点firstsecondthird

但是,我还创建了一个fourthfifth 节点,并将它们分配给第三个节点之后的指针。我原以为会出现分段错误,但程序却成功读取并打印了 fourthfifthint id,尽管事实上我没有分配内存。

我误会malloc()了吗?另外,如果我们将指针视为数组,有没有办法获取该数组中元素的数量?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#include <string.h>

struct node{
    int id;
};

int main(){
    struct node * array;
    array = malloc(sizeof(struct node) * 3);
    struct node first = {7};
    struct node second = {8};
    struct node third = {9};
    struct node fourth = {10};
    struct node fifth = {11};
    *(array + 0) = first;
    *(array + 1) = second;
    *(array + 2) = third;
    *(array + 3) = fourth;
    *(array + 4) = fifth;

    printf("%d, %d, %d, %d, %d\n", (array + 0) -> id, (array + 1) -> id, (array + 2) -> id, (array + 3) -> id, (array + 4) -> id);
    printf("%d\n", sizeof(array));
}

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    您所看到的是未定义的行为,这是最令人困惑的:不该起作用的事情起作用了。

    当您使用malloc 分配给定大小的内存块(例如,20 字节)时,对于分配准确该数量的实现没有任何限制。事实上,在大多数现代 PC 和操作系统上,内存更有效地分配在固定大小的块中,而不是大于 20 字节,通常为 512 或 1,024 字节(通常称为内存页面) .

    因此,在您的情况下,这似乎已经发生 - 但 永远 依赖于这种工作。事实上,你可以运行你的程序 1000 次,它可以工作,但在第 1001 次运行时它就不起作用了。

    另外,如果我们将指针视为数组,有什么办法可以 得到那个数组的元素个数?

    简短的回答:不!当您使用malloc 来保留内存时,您需要确保自己保持在分配的范围内。

    【讨论】:

    • 感谢您的回答!
    • 问题中的行为并不能证明malloc 分配的内存量超过了请求的内存量。程序可以对其进行写入和读取这一事实仅意味着内存已映射和可写。它可能是分配给其他东西的内存、内存管理子系统从操作系统获取但尚未分配的内存、内存管理子系统使用的数据结构或其他东西。
    猜你喜欢
    • 2013-07-15
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多