C,malloc大小

时间:2011-03-25 06:10:55

标签: c malloc

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函数中做同样的事情。这次不起作用......

3 个答案:

答案 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