我正在编写一些代码,我使用了函数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;
}
答案 0 :(得分:0)
在C中,许多错误和“错误”的东西不会显示编译器的错误消息。实际上,在运行程序时,您甚至可能看不到错误信息 - 但是在另一台计算机上运行程序的另一个人可能会看到错误。
C中的一个重要概念称为未定义行为。换句话说,这意味着您的程序行为无法预测,但您可以在此问题中详细了解此主题:Undefined, unspecified and implementation-defined behavior。
您的程序未定义有两个原因:
size
或nmemb
为零时,calloc()
可能会返回NULL
。你的程序没有检查calloc()
的输出,所以当你test[i]
尝试引用NULL
指针时,你很可能会检查calloc()
指针的结果。 {1}}和malloc()
。malloc()
或calloc()
时,您必须为数组分配动态内存。您可以使用指针访问数组的元素。但是你无法访问任何过去数组。也就是说,如果您分配n
元素,则不应尝试访问n+1
- 元素 - nether以供阅读。上述两个项目都会使您的程序调用未定义的行为。 可能对于访问上面列出的第2项以外的空对象也是未定义的,但我不确定。
您应该始终注意未定义的行为,因为当您的程序调用UB时,它必然是不可预测的。您可能看到编译错误,程序可以给出错误消息,可以成功运行而没有任何问题或可以< / em>清除硬盘中的每个文件。