【发布时间】:2020-07-15 11:22:01
【问题描述】:
这是用 C 语言将两个方阵相乘的代码。
在void multiply()函数中使用malloc和calloc有什么区别?
使用malloc 时,我得到了垃圾值,但calloc 提供了正确的答案。
只有第一行在输出垃圾值,那么与calloc 相比,malloc 在堆中分配空间的方式是否存在问题?
#include <stdio.h>
#include <stdlib.h>
int *getArray(int);
void display(int *, int, int);
void multiply(int *, int *, int);
int main() {
int n;
printf("enter dimension of square matrix:\n");
scanf("%d", &n);
int *arr1;
int *arr2;
arr1 = getArray(n);
display(arr1, n, n);
printf("\n now give input for next array");
arr2 = getArray(n);
display(arr2, n, n);
printf("\n\n\n");
multiply(arr1, arr2, n);
return 0;
}
int *getArray(int n) {
int *arr = (int *)malloc(n * n * sizeof(int));
printf("\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", (arr + i * n + j));
}
}
/*for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf(" %d ", *(arr + i * n + j));
}
printf("\n");
}*/
return arr;
}
void display(int *arr, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf(" %d ", *(arr + i * row + j));
}
printf("\n");
}
}
void multiply(int *arr1, int *arr2, int n) {
int *arr = (int *)calloc(n * n, sizeof(int));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
*(arr + i * n + j) += (*(arr1 + i * n + k)) * (*(arr2 + k * n + j));
}
}
}
printf("product of above matrices = \n\n");
display(arr, n, n);
}
【问题讨论】:
-
使用
malloc(),分配的内存没有初始化;使用calloc(),分配的内存被初始化为所有字节为零。 -
在您的情况下,初始化内存时没有功能差异。但是在这里使用
calloc意味着calloc将不必要的设置为零。 -
这能回答你的问题吗? Difference between malloc and calloc?
-
calloc(n*n,sizeof(int)不像malloc(n*n*sizeof(int))那样容易溢出大小计算。最好将malloc(sizeof(int)*n*n*)与malloc()一起使用。 -
@chux-ReinstateMonica:实际上,如果
n * n超出int类型的范围,这两个调用都会出现问题,它们只是以不同的方式失败。malloc(sizeof(int) * n * n)肯定更好,calloc((size_t)n * n, sizeof(int))也是可取的。