C数组动态内存没有上限

0 c arrays memory-management

我这里有我的代码:

int main(){
  printf("%lu\n",(1 * sizeof(int)));
  int* hello=malloc(1 * sizeof(int));
  hello[1000000]=10;
  printf("%d \n",hello[1000000]);
  printf("%lu \n", sizeof(hello));

  int* goodbye=malloc(100 * sizeof(int));
  printf("%lu \n",sizeof(goodbye));

  hello=goodbye;

  printf("%lu \n",sizeof(hello));

  hello=realloc(hello,20);

  hello[1]=0;

  printf("%lu \n",sizeof(hello));
}
Run Code Online (Sandbox Code Playgroud)

它输出这个:

4 10 8 8 8 8

这个 throws 没有警告或错误,这对我来说很奇怪,因为我只为数组 hello 分配了 4 个字节,但可以访问 hello[1000000]。

另外,我尝试调整你好和再见的大小,但大小保持不变。在第 10 行,我做了 hello=goodbye; 哪个应该调整它的大小?我对 C 内存的东西有点陌生。Realloc 也不会改变我的数组的大小。我试图使“hello”成为一个动态大小的数组。我在这里做错了什么?

该代码应该是重新分配内存并更改 int 数组的大小的准系统。

Cof*_*sso 5

这个 throws 没有警告或错误,这对我来说很奇怪,因为我只为数组 hello 分配了 4 个字节,但可以访问 hello[1000000]。

这是未定义的行为。你很幸运,这次它碰巧对你有用。但是,这并不能得到保证,并且您永远不应该依赖这种行为。

另外,我尝试调整你好和再见的大小,但大小保持不变。

8看到的是指针的大小,而不是它所指向的对象的大小。无论您分配多少内存,指向该内存的指针始终具有相同的大小。

在第 10 行,我做了 hello=goodbye; 哪个应该调整它的大小?我对 C 内存的东西有点陌生。

这不是调整它的大小,这只是指向hello与 相同的位置goodbye

一张图可能会有所帮助。

之前,你有这个:

hello             goodbye
|                    |
|                    |
|                    |
v                    v
MEMORY 1          MEMORY 2
Run Code Online (Sandbox Code Playgroud)

完成后hello = goodbye,你有这个:

hello             goodbye
|                     |
\-----------------\   |
                  |   |
                  v   v
MEMORY 1         MEMORY 2
Run Code Online (Sandbox Code Playgroud)

即,hello现在指向与 相同的位置goodbye

Realloc 也不会改变我的数组的大小。我试图使“hello”成为一个动态大小的数组。我在这里做错了什么?

Realloc 确实改变了数组的大小,你不是不看数组的大小,而是看指针的大小,如上所述。