c struct pointer array vs struct pointer pointer malloc

时间:2015-03-08 14:49:18

标签: c arrays struct malloc

工作的:

struct data{
    int val;
};

int main(void){
    struct data *var[2];
    (*var)->val = 6;
    printf("%d\n", (*var)->val);
    return 0;
}

段错误:

struct data{
    int val;
};

int main(void){
    struct data **var = malloc(3 * sizeof(struct data));
    (*var)->val = 6;   // <- crash
    printf("%d\n", (*var)->val);
    return 0;
}

有人可以解释为什么会出现段错误并给我一个工作示例,对我能理解的段错误代码进行最小的更改。

1 个答案:

答案 0 :(得分:0)

指针不是malloc,你取消引用一个无效的指针,因为你的数组是一个poitners数组,它的元素没有指向有效的内存。

试试这个

#include <stdio.h>
#include <stdlib.h>

struct data
{
    int val;
};

int main(void)
{
    struct data *var[2];
    /* You need to malloc before dereferencing `var[0]` */
    var[0] = malloc(sizeof(var[0][0]));
    if (var[0] != NULL)
    {
        var[0]->val = 6;
        printf("%d\n", var[0]->val);

        free(var[0]);
    }
    return 0;
}

另外,使用(*var)->val = 6绝对不必要且令人困惑。

在第二种情况下,你也应该做几乎相同的事情,除了指针数组是指向一个poitners数组的指针,因此也需要malloc(),所以你的第二个例子意外地工作,因为有足够的记忆malloc()但它也是错的,你应该这样做

#include <stdio.h>
#include <stdlib.h>

struct data
{
    int val;
};

int main(void)
{
    struct data **var;
    var = malloc(2 * sizeof(var[0]));
    if (var == NULL)
        return -1;
    /* You need to malloc before dereferencing `var[0]` */
    var[0] = malloc(sizeof(var[0][0]));
    if (var[0] != NULL)
    {
        var[0]->val = 6;
        printf("%d\n", var[0]->val);

        free(var[0]);
    }
    free(var);
    return 0;
}