c - 为什么我可以读取 3 个结构,但只分配 2 个?

标签 c memory memory-management

我试图理解为什么以下代码在 C 中有效:

test *liste = NULL;

liste = malloc(sizeof(test)*2);
liste[0].number = 5;
liste[1].number = 10;
liste[2].number = 15;

printf("%d\n", liste[0].number);
printf("%d\n", liste[1].number);
printf("%d\n", liste[2].number);

结构是:

typedef struct test {
    int number;
} test;

输出:

5
10
15

我想,只创建 2 个“test”元素并访问 2 个以上(如这里的 3 个)会导致内存访问冲突?但为什么这会起作用呢?

这里变得越来越困惑......

最佳答案

欢迎来到未定义行为的奇妙世界,在这里任何事情都有可能发生!

C 规范规定,在某些情况下,执行操作的结果会导致所谓的未定义行为。这意味着我们无法保证执行这些操作时可能会发生什么。程序可能会立即崩溃。它可能会继续运行,但随机内存区域已损坏。它似乎不会造成任何不良影响。它还可能使计算机获得感知并创作诗歌。 (最后一个不太可能,但在技术上是可能的!)

就您而言,如果您尝试访问不属于您的内存(此处,通过读取 malloc 数组的末尾),结果将是未定义的行为。在您的系统上,在这种特殊情况下,似乎走一步恰好不会引起任何问题,但走得更远确实会导致崩溃。其原因可能与内存分配器的细节和您所在的特定机器有关。如果您使用的是 Python 或 Java 等语言,因为这些语言的错误更加明确且定义得更好,这可能会让人感到不舒服。

关于c - 为什么我可以读取 3 个结构,但只分配 2 个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56401112/

相关文章:

c函数返回sprintf字符串

c - Xtext - 在没有语义谓词的情况下解决歧义?

c - 此函数声明中是否存在语法错误?

mysql - 限制 MySQL 用户的 CPU/内存使用

C++ 引用与局部变量

c - 双向链接中的用户输入

performance - 我如何知道 Eclipse 插件使用了多少内存(单独)

c++ - 删除运算符和数组?

c++ - 调用析构函数或调用 `delete` 时是否释放内存?

c++ - 深层复制构造函数 - 类 C++ 中的动态数组无效的 free()/delete/delete[]/realloc()