我有我的密码:
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));
}它的产出如下:
4 10 8 8 8
这个抛出没有警告或错误,这对我来说很奇怪,因为我只为数组hello分配了4个字节,但是可以访问hello1000000。
另外,我试着用再见来调整hello的大小,但是大小保持不变。在第10行,我执行hello=goodbye;哪个应该调整它的大小?我对c记忆有点陌生。Realloc也不改变我的数组的大小。我试图使"hello“成为一个动态大小的数组。我在这里做错什么了?
代码应该是简单的,重新分配内存和改变int数组的大小。
发布于 2022-07-12 03:30:08
这个抛出没有警告或错误,这对我来说很奇怪,因为我只为数组hello分配了4个字节,但是可以访问hello1000000。
这是不明确的行为。你运气好,这次正好为你工作。然而,这并不能保证,你永远也不应该依赖这种行为。
也尝试用再见来调整hello的大小,但是大小保持不变。
您看到的8是指针的大小,而不是它所指向的东西的大小。无论分配多少内存,指向该内存的指针都将始终是相同大小的。
在第10行,我执行hello=goodbye;哪个应该调整它的大小?我对c记忆有点陌生。
这不是调整大小,这只是使hello指向与goodbye相同的位置。
画一幅画也许会有帮助。
以前,你有过这样的经历:
hello goodbye
| |
| |
| |
v v
MEMORY 1 MEMORY 2在执行hello = goodbye之后,您将得到以下内容:
hello goodbye
| |
\-----------------\ |
| |
v v
MEMORY 1 MEMORY 2也就是说,hello现在指向与goodbye相同的位置。
Realloc也不会更改我的数组的大小。我试图使"hello“成为一个动态大小的数组。我在这里做错什么了?
Realloc确实改变了数组的大小,您不是要查看数组的大小,而是要查看指针的大小,如前所述。
发布于 2022-07-12 03:30:53
这个抛出没有警告或错误,这对我来说很奇怪,因为我只为数组hello分配了4个字节,但是可以访问hello1000000。
你在一个被称为“未定义的行为”的领域。C不保证您的程序在这种情况下会崩溃。可能是由于其他原因,hello[1000000]碰巧落在了一个有效的地址上。这样做可能会破坏具有其他重要目的的记忆。
在我的机器上,它坠毁了。在https://godbolt.org/ (一个用来调查程序和编译器的工具)上,它也崩溃了。
也尝试用再见来调整hello的大小,但是大小保持不变。在第10行,我执行hello=goodbye;哪个应该调整它的大小?
你没有调整尺寸。您仍然拥有大小为1 * sizeof(int))的内存分配。hello过去常常指向它,但现在它不再这样做了,但是它仍然存在于内存中,占用了空间。您创建了一个大小100 * sizeof(int)的新分配,并使hello指向这个值。
Realloc也不会更改我的数组的大小。我试图使"hello“成为一个动态大小的数组。我在这里做错什么了?
只要正确地跟踪大小和正确的realloc,就可以正确地创建一个可变大小的数组。特别是,只要realloc(hello,20);成功,现在您就可以安全地存储20个字节的数据(即5个4字节的int)。
您可能需要考虑定义一个结构,它可以包含两个项:一个指向您分配的缓冲区的指针,以及一个指示其当前大小的size_t。当您需要一个更大的数组,realloc和更新的大小。
您所看到的问题来自于sizeof(hello) -它实际上并不检查数组的大小,而是简单地指示指针本身的大小。在我的机器上,指针的大小是8个字节,所以它总是打印8个字节。
https://stackoverflow.com/questions/72946665
复制相似问题