矩阵的大小未正确评估

时间:2015-05-11 01:43:53

标签: c memory malloc

我正在研究一个涉及生成随机图的邻接矩阵的C程序。以下是源代码片段:

rm -rf "$f/vendor" "$f/composer.lock"

这部分代码负责创建矩阵(#include <stdio.h> #include <stdlib.h> #include <string.h> #include "test.h" int main() { int **A = create_matrix(4, 3); destory_matrix(A); return 0; } int** create_matrix(int size, int seed) { // Allocate space for matrix int **A = malloc(size * size * sizeof(int)); for (int r = 0; r < size; r++) { A[r] = malloc(size * sizeof(int)); } // Fill entries for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { A[i][j] = seed * (i + 1) * (j + 1); } } return A; } void destory_matrix(int **A) { int size = sizeof(A[0]) / sizeof(int); for (int r = 0; r < size; r++) { free(A[r]) } free(A); } 函数)和释放内存(create_matrix())。我正在查看destroy_matrix(),并注意到当传入4x4矩阵时,变量大小计算为2而不是4.有人可以解释为什么会发生这种情况吗?

2 个答案:

答案 0 :(得分:1)

我认为你对sizeof运算符有一个基本的误解。通常,它不能用于获取动态分配的复合对象的大小。 sizeof运算符根据操作数的类型返回给您的大小。在您的情况下,操作数的类型是int *。我猜你是在64位系统上运行的。所以sizeof任意指针都是8.因此,无论矩阵的大小如何,您的size变量总是为2。

答案 1 :(得分:1)

应用于指针的sizeof运算符返回指针类型的大小,而不是它恰好指向的任何已分配内存的大小。

这是C中数组类型和指针类型之间的主要区别之一(注意:数组可以衰减为指针)。 sizeof应用于静态指定的数组类型(例如int foo[n];)将以字节为单位获取数组的大小。

由于你的字大小可能是8字节(64位),指针的大小将是8字节,如果sizeof(int)是4字节(32位),你有8/4 = 2 ;

如果需要运行时大小的堆分配矩阵,则需要考虑其他一些方法来存储矩阵的维数,例如:存储维度的结构和指向已分配内存的指针。不过,最好完全避免可能的堆碎片。

如果您有C99,请尝试此操作:

int n = 4, m = 5;
int (*A)[n] = malloc(m * sizeof A[0]));
free(A);

这会将m长度int[n]数组分配为一个块,因此您可以size_t n = sizeof(A)/sizeof(A[0]);获取一个维度(n),但您需要如果要正确迭代,请存储m