为什么我在此char数组中能存储的字节数比malloc()给定的字节数多?

我今天在C语言中了解了动态内存分配。我了解了如何在需要打印句子时使用malloc()中的stdlib.h将内存分配给char数组。但是后来我看到我可以存储更多的字节,然后再分配。这是我的完整代码。

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

int main(void) {
  int i;
  char *foo;
  foo = (char*)malloc(20);
  for (i=0;i<30;i++)
  {
    foo[i]='a';
    printf("\n%d) %c",i+1,foo[i]);
  }
  return 0;
}

输出

1) a
2) a
3) a
4) a
5) a
6) a
7) a
8) a
9) a
10) a
11) a
12) a
13) a
14) a
15) a
16) a
17) a
18) a
19) a
20) a
21) a
22) a
23) a
24) a
25) a
26) a
27) a
28) a
29) a
30) a

如您所见,我给了foo 20个字节,但能够在其中存储30个字节。到底是怎么回事?我误解了malloc()吗?

fanfan1133 回答:为什么我在此char数组中能存储的字节数比malloc()给定的字节数多?

这些评论告诉您出了什么问题,但是我将合并这些评论。

您使用malloc分配存储空间。这将返回您可以存储数据的地址。但是,无论是C还是malloc或堆都不会检查是否仅将 存储在给定的区域中。如果您写的内容超出了分配的范围,则说明您写的是“非您的”范围。这可能导致各种类型的不确定行为。

某些内存管理器将拦截您的尝试并中止您的程序。其他内存管理器不会执行此操作,但是由于您写入的不是您自己的区域,因此您可能会覆盖内存管理器中的数据,并且由于内存管理器的数据已损坏,任何下一次分配内存的尝试都可能会失败。或者您正在覆盖属于其他人的内存。

所以看来您可以写的内容超出分配的数量,这并不意味着您的程序正确。实际上,这完全是错误的,并且会在其他地方导致错误。因此,您的程序可能会进行无效的计算,例如飞机失事...这被称为未定义的行为,作为程序员,您必须注意自己总是分配需要的东西,并且永远不要离开您分配的范围。

本文链接:https://www.f2er.com/3152423.html

大家都在问