我这里有我的代码:
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 数组的大小的准系统。
这个 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 确实改变了数组的大小,你不是不看数组的大小,而是看指针的大小,如上所述。