我正在研究一个涉及生成随机图的邻接矩阵的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.有人可以解释为什么会发生这种情况吗?
答案 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
。