具有结构工作的 C malloc(1)

C malloc(1) with structure working

我实际上正在学习 C,并且我得到了 "problem"。

我使用 malloc(1) 创建了一个指向具有 char* 和 int 的结构的指针。 指针有效,我可以毫无问题地编辑结构子项。

我还创建了一个指向 int 的指针(仍然使用 malloc(1))并且它可以工作。另一件事是,当我尝试访问 *(pointer + 33780) 时,我没有收到核心转储错误(当值稍高时会出现核心转储)它有效,但默认值为 0.

谢谢,这不是 "problem" 但我想知道为什么会这样。

抱歉成为英国人的凶手。

编辑:这里是代码

struct Personne
{
  char *name;
  int age;
};

int main(int argc, char *argv[])
{
    printf("%ld\n", sizeof(struct Personne));
    struct Personne *testPoint = malloc(1);
    printf("testPoint : %p\n", testPoint);
    printf("testPoint : %p\n", testPoint->name);
    testPoint->name = "UnNomInconnu";
    testPoint->age = 20;

    free(testPoint);
    return 0;
}

实际上,malloc 函数并没有分配恰好为 1 字节大小或类似小值的内存范围。通常分配的区段的最小大小等于段落的大小,即 16 字节。

因此,如果您将编写示例

char *p = malloc( 1 );

那么分配的extent的实际大小可以等于16字节

然而你不应该依赖这个特性,因为一般来说,根据 C 标准,这是未定义的行为。

你需要:

struct Personne *testPoint = malloc(sizeof(*testPoint));

1 个字节的内存不足以容纳您的结构。 malloc() 参数的含义是字节数。但是,malloc() 不一定会保护超出分配段的内存,因此在某些情况下可以覆盖边界而不会造成致命后果。

 struct Personne *testPoint = malloc(1);

让您进入未定义行为的领域。不幸的是,UB 可以包含 "the program runs correctly in all test environments but fails in production at worst possible time" - 并且经常包含。

如果你在linux运行你的程序下用valgrindand/or电围栏。您将了解为什么存在这些工具。