malloc返回指向已分配内存的指针

jam*_*her 1 c malloc

自从我写完C以来已经很长时间了.我的理解是malloc返回一个指向新分配的内存区域的指针,该内存区域与先前malloc编辑的反应不重叠.但是,我的程序(下面)似乎显示malloc返回指向已分配区域中间的指针!

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int* bla;
  int baz;
  int qux;
  int bar;
} foo;

int main() {
  foo* foo = malloc(sizeof(foo));
  int* arr = malloc(sizeof(int) * 10);
  // my understanding of malloc is that `foo` and `bar` now point to
  // non-overlapping allocated memory regions

  printf("arr          %p\n", arr);            // but these print
  printf("&(foo->bar)  %p\n", &(foo->bar));    // the same address

  foo->bar = 42;
  printf("arr[0] = %d\n", arr[0]);   // prints 42

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在编译并运行它:

$ cc --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ cc     main.c   -o main
$ ./main
arr          0x7fa68bc03210
&(foo->bar)  0x7fa68bc03210
arr[0] = 42
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

jda*_*nay 5

那是什么?!

foo* foo = malloc(sizeof(foo));
Run Code Online (Sandbox Code Playgroud)

请使用不同的标识符!

foo* variable = malloc(sizeof(foo));
Run Code Online (Sandbox Code Playgroud)

只是为了确保我测试了这个main():

int main() {
    printf("sizeof(foo)=%zu\n", sizeof(foo));
    foo* foo = malloc(sizeof(foo));
    printf("sizeof(foo)=%zu\n", sizeof(foo));
}
Run Code Online (Sandbox Code Playgroud)

输出(带有LLP64的64位):

sizeof(foo)=24
sizeof(foo)=8
Run Code Online (Sandbox Code Playgroud)

不要使用两次相同的标识符,你会得到不好的惊喜.