首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C数组动态内存没有上限

C数组动态内存没有上限
EN

Stack Overflow用户
提问于 2022-07-12 03:17:10
回答 2查看 49关注 0票数 0

我有我的密码:

代码语言:javascript
复制
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数组的大小。

EN

回答 2

Stack Overflow用户

发布于 2022-07-12 03:30:08

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

这是不明确的行为。你运气好,这次正好为你工作。然而,这并不能保证,你永远也不应该依赖这种行为。

也尝试用再见来调整hello的大小,但是大小保持不变。

您看到的8是指针的大小,而不是它所指向的东西的大小。无论分配多少内存,指向该内存的指针都将始终是相同大小的。

在第10行,我执行hello=goodbye;哪个应该调整它的大小?我对c记忆有点陌生。

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

画一幅画也许会有帮助。

以前,你有过这样的经历:

代码语言:javascript
复制
hello             goodbye
|                    |
|                    |
|                    |
v                    v
MEMORY 1          MEMORY 2

在执行hello = goodbye之后,您将得到以下内容:

代码语言:javascript
复制
hello             goodbye
|                     |
\-----------------\   |
                  |   |
                  v   v
MEMORY 1         MEMORY 2

也就是说,hello现在指向与goodbye相同的位置。

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

Realloc确实改变了数组的大小,您不是要查看数组的大小,而是要查看指针的大小,如前所述。

票数 5
EN

Stack Overflow用户

发布于 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个字节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72946665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档