当前位置: 首页 > 知识库问答 >
问题:

C中calloc分配了多少个成员[重复]

西门淮晨
2023-03-14

我希望下面的代码片段能够使用calloc为五个成员分配内存

$ cat calloc.c
// C program to demonstrate the use of calloc() 
// and malloc() 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
  int *arr; 
  arr = (int *)calloc(5, sizeof(int)); 
  printf("%x\n", *arr);
  printf("%x\n", *(arr+1));
  printf("%x\n", *(arr+2));
  printf("%x\n", *(arr+3));
  printf("%x\n", *(arr+4));
  printf("%x\n", *(arr+5));
  printf("%x\n", *(arr+6));
  // Deallocates memory previously allocated by calloc() function 
  free(arr); 

  return(0); 
} 

但它似乎分配了五个以上;它分配了六个成员,为什么?

./a.out 
0
0
0
0
0
0
411

共有3个答案

柳培
2023-03-14

它分配的内存未超过5。它已分配了5个成员,并用0对其进行了初始化。当您访问分配内存的外部时,它可能会被写入任何内容,而不一定是非零值。

齐铭
2023-03-14

首先,让我们弄清楚:就所有目的而言,*(a x)a[x]是相同的。

C具有自由内存访问权限。如果您执行arr[1000],您仍然会打印一个值,或者程序将因分段错误而崩溃。这是未定义行为的典型情况。编译器无法知道您编写的代码是否错误,因此它无法抛出错误。相反,C标准称这是未定义行为。这意味着您正在访问不应该访问的内存。

作为程序员,您有责任检查您没有超出数组的边界,而不是编译器的边界。此外,calloc用0初始化所有元素。你认为你为什么得到411?再次运行它,您可能会得到不同的值。您在a[5]处访问的内存没有分配给数组。相反,您正在超出数组的边界。该内存很可能被分配给其他东西。如果它被分配给另一个程序,您在运行程序时会遇到分段错误。

曹自怡
2023-03-14

分配内存不像买Lollipop。分配内存更像是购买土地。

如果你买了五个Lollipop,你试图吃第六个,这显然是行不通的——甚至谈论“试图吃第六个”也是非常荒谬的。

但是如果你买了一块10英尺乘50英尺的土地,你开始建造10英尺乘10英尺的建筑,在建造了其中的五栋之后(完全占据了你的土地),你建造了第六栋侵占了你邻居的土地,你的邻居可能不会马上注意到,所以你可能会逃脱惩罚。(无论如何,有一段时间。最终肯定会有麻烦。)

类似地,如果你分配一个大小为5的数组,然后尝试访问一个不存在的第6个元素,那么没有自然法则可以阻止它,就像你尝试吃不存在的第6个Lollipop一样。在C语言中,您通常不会收到关于越界数组访问的错误消息,因此您可能会得到似乎有效的代码,即使它正在做一些完全不可接受的事情,例如侵占邻居的土地。

 类似资料:
  • 我想在C++11中使用多线程来调用一个类成员函数在它自己的线程中。我已经能够让它与全局函数一起工作:

  • 问题内容: 问题答案: 实习生池中只有一个字符串,每次您运行代码时都会重复使用。 然后是每次运行该行时都会构造的额外字符串。因此,例如: 将以11个字符串结尾,并在内存中包含“ abcd”内容-被插入的1个副本和10个副本。

  • 在JDK8中,当我使用ParallelStream时会生成多少线程?例如,在代码中: 如果这个列表有100000个项目,那么会产生多少个线程? 另外,是每个线程都得到相同数量的项目来工作,还是随机分配?

  • calloc(配置内存空间) 相关函数 malloc,free,realloc,brk 表头文件 #include <stdlib.h> 定义函数 void *calloc(size_t nmemb,size_t size); 函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*s

  • calloc 配置内存空间 相关函数 malloc,free,realloc,brk 表头文件 #include <stdlib.h> 定义函数 void *calloc(size_t nmemb,size_t size); 函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*

  • 所以我不确定是0还是2。 如果有人知道请告诉我。