在 C 语言中找不到 malloc() 和 calloc() 之间的区别(从虚拟机 Linux 运行)



*注意:这不是一个重复的问题,因为你提到的答案并不能回答我的问题。我知道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终止的,但在大多数平台上,输出将是:

其他

相关内容

  • 没有找到相关文章

最新更新