*注意:这不是一个重复的问题,因为你提到的答案并不能回答我的问题。我知道malloc()和calloc()应该做什么,但想知道为什么在虚拟机中使用它时似乎没有区别。
我知道区别应该是什么——malloc()只分配内存,而calloc()用0初始化它。
问题是,在我的代码中,它没有显示出来,并且malloc()在从我的虚拟机Ubuntu运行时似乎没有任何区别。我运行了几次,malloc的行为和calloc完全一样。
注意——我只是用我的实际硬盘检查了一下,它似乎还可以,但我确实得到了不同的结果。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
int i,n;
float *ptr1, *ptr2;
printf("enter a total number of float items: ");
scanf("%d", &n);
ptr1 = malloc(n*sizeof(float));
ptr2 = calloc(n, sizeof(float));
printf("malloc | callocn");
printf("----------------------n");
for(i=0;i<n;i++)
printf("%-10f %10fn", *(ptr1+i), *(ptr2+i));
printf("n");
free(ptr1);
free(ptr2);
return 0;
}
calloc
保证您拥有一个零内存块,而malloc
则没有。然后可能会发生malloc
这样做,但从不依赖它。
从malloc获得的内存可以包含任何内容。它可能包含零,也可能包含其他内容。
以下示例显示(在大多数平台上)从malloc返回的内存尚未设置为0:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *p;
int i;
for (i = 0; i < 1024; i++) {
p = malloc(1024);
strcpy(p, "something else");
free(p);
}
p = malloc(100); // Get a fresh memory block
printf("%sn", p); // You should not access the memory returned from malloc without assigning it first, because it might contain "something else".
return 0;
}
这个程序可以做任何事情,我们甚至不知道字符串是否是NUL
终止的,但在大多数平台上,输出将是:
其他