关于calloc的奇怪之处

时间:2017-01-04 22:23:47

标签: c calloc

我正在编写一些代码,我使用了函数calloc

据我所知,当传递给这个函数的第一个和第二个参数都为零时,该函数将为0个元素分配必要的空间,每个元素的大小为0,但这是奇怪的事情。

即使n>该程序也能正常工作。为什么会这样?我认为它应该显示错误,因为我试图写入不存在的数组位置。谢谢!

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

int main(){
  int n;
  scanf("%d", &n);
  int *test = calloc(0, 0);
  for(int i = 0; i < n; i++){
    test[i] = 100;
    printf("%d ", test[i]);
  }
  return 0;
}

1 个答案:

答案 0 :(得分:0)

在C中,许多错误和“错误”的东西不会显示编译器的错误消息。实际上,在运行程序时,您甚至可能看不到错误信息 - 但是在另一台计算机上运行程序的另一个人可能会看到错误。

C中的一个重要概念称为未定义行为。换句话说,这意味着您的程序行为无法预测,但您可以在此问题中详细了解此主题:Undefined, unspecified and implementation-defined behavior

您的程序未定义有两个原因:

  1. sizenmemb为零时,calloc()可能会返回NULL。你的程序没有检查calloc()的输出,所以当你test[i]尝试引用NULL指针时,你很可能会检查calloc()指针的结果。 {1}}和malloc()
  2. 当您致电malloc()calloc()时,您必须为数组分配动态内存。您可以使用指针访问数组的元素。但是你无法访问任何过去数组。也就是说,如果您分配n元素,则不应尝试访问n+1 - 元素 - nether以供阅读。
  3. 上述两个项目都会使您的程序调用未定义的行为。 可能对于访问上面列出的第2项以外的空对象也是未定义的,但我不确定。

    您应该始终注意未定义的行为,因为当您的程序调用UB时,它必然是不可预测的。您可能看到编译错误,程序可以给出错误消息,可以成功运行而没有任何问题或可以< / em>清除硬盘中的每个文件。