我试图理解为什么以下代码在 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/