为什么这个C结构代码有效?

时间:2016-01-17 00:08:43

标签: c pointers struct

我正在使用指向结构和结构数组的指针来了解它们是如何工作的。令我感到困惑的是,为什么接下来的工作会编译并产生正确的结果:

#include <stdio.h>
#include <stdlib.h>
int main() {
    typedef struct {
        char *name;
        int count;
    } word;
word *word_array;
word_array = malloc(sizeof(word));
word_array[2048].name = "foo";
word_array[2048].count = 5;
printf("%s %d\n", word_array[2048].name, word_array[2048].count);

打印:foo 5

malloc为word_array分配了多少内存?甚至还在发生什么?这种未定义的行为恰好是编译运行的吗?

1 个答案:

答案 0 :(得分:1)

  

malloc分配给word_array的内存是多少?

sizeof(word)字节,就像你告诉它的那样 - 足够的内存来容纳一个word

  

甚至还在进行什么?这种未定义的行为恰好是编译运行的吗?

是。请注意,它编译并不奇怪(大多数未定义的行为不会导致编译错误,甚至是警告)。

由于您似乎已经知道未定义的行为,因此您知道它可能会崩溃,或者它可能似乎有效,或者介于两者之间。也许下周二,当你试图向首席执行官展示时,你的程序会崩溃。也许你会在六个月内升级你的编译器,然后它会一直开始崩溃。如果你的程序写了任何文件,那么它可能已经破坏了那些文件。等等。