typedef struct _lnode{
struct _lnode *next;
size_t row;
size_t column;
short data;
}lnode;
typedef struct _matrix{
size_t width;
size_t height;
size_t k;
int **data;
}matrix;
matrix* make_matrix(size_t width, size_t height, size_t k){
matrix *m= malloc(sizeof(matrix));
//matrix *m= malloc(sizeof(*matrix)); DOES NOT WORK
if(m==NULL) return NULL;
m->width = width;
m->height = height;
/*
Since m->data is a int **, it points to int *,
so I have to allocate a number of int *-sized objects to store in it.
*/
m->data = malloc(sizeof(int *)*height);
if(m->data == NULL){
free(m);
return NULL;
}
for(size_t i=0; i < height; i++){
m->data[i] = malloc(sizeof(int)*width);
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
for(size_t j = 0; j < width; j++)
m->data[i][j] = 0;
}
return m;
}
lnode* make_node(size_t row, size_t column, short data){
lnode *newNode = malloc(sizeof(*newNode));
if(newNode==NULL) return NULL;
newNode->row = row;
newNode->column = column;
newNode->data = data;
return newNode;
}
这两个功能正常。在make_matrix函数中,我首先尝试了这个
matrix *m= malloc(sizeof(*matrix));
而不是
matrix *m= malloc(sizeof(matrix));
然后它只适用于for循环中的第一次迭代,并且属于if语句
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
我知道sizeof(指针)将返回指针的大小。在make_node函数中我正在做lnode * newNode = malloc(sizeof(* newNode));它工作得很好。我想在make_matrix函数中做同样的事情。这次不起作用......
答案 0 :(得分:2)
newNode
是一个变量,因此sizeof *newnode
返回它想要指向的东西的大小。 make_matrix()
中的等效内容为sizeof *m
,而不是sizeof *matrix
。
答案 1 :(得分:0)
你说“我知道sizeof(指针)将返回指针大小”
但我不认为你这样做。
你需要这样做:
matrix *m = malloc(sizeof(matrix));
否则你得到4个字节(如果你的机器使用64位指针,则为8个字节)。
“它有效”,你正在做的事情是不正确的。行为未定义。你很幸运。
答案 2 :(得分:0)
如果我正确理解了您的问题,那么您说代码失败是因为m->data[i]
不为空?
malloc
不会初始化您的变量,您获得的内容是不可预测的。使用calloc
初始化为所有位零,或者如果你有一个符合标准的编译器使用像
*m = (matrix){ 0 };
将所有字段初始化为0
。