访问和设置结构中的数组值

时间:2011-02-17 04:21:37

标签: c arrays pointers struct segmentation-fault

我有这样的结构:

typedef struct {
    int sizes[3];
    float **vals[3]; // an array of size 3 of float ** pointers
} mystruct;

我要做的是在一个带有mystruct指针的函数中设置这些数组值。

void populateStruct(mystruct *s) {
    int i, j, n;

    for (n = 0; n < 3; n++) {
        scanf("%d", &s->sizes[n]);

        // Malloc the float pointers (**vals) based on the scanned sizes
        s->vals[n] = (float **)malloc(s->sizes[n] * sizeof(float *));
        for (i = 0; i < s->sizes[n]; i++)
            s->vals[n][i] = (float *)malloc(s->sizes[n] * sizeof(float));

        // Populate the float "arrays"
        for (i = 0; i < s->sizes[n]; i++) {
            for (j = 0; j < s->sizes[n]; j++) {
                scanf("%f", &s->vals[n][i][j]);
            }
        }
    }
}

以下是我在main中使用该功能的方法:

int main() {
    mystruct *s1;
    populateStructure(s1);
    return 0;
}

这段代码编译得很好,但是当我运行它时会出现seg错误。 C不是我的强项,所以我不太清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

你是如何宣布自己的结构以及如何传递它?

在你调用populateStruct的函数中,你应该声明s:

mystruct s and call populateStruct(&s)

mystruct *s;
s = malloc(sizeof(mystruct));
populateStruct(s);

答案 1 :(得分:1)

mystruct *s1; 

s1只是一个具有不可预测值的指针。您没有为所需的结构分配内存。 取消引用一个狂野(未初始化)指针会导致segv。 您可以将代码修改为:

    mystruct s1;
    populateStructure(&s1);

    mystruct *s1 = (mystruct *)malloc(sizeof(mystruct));
    populateStructure(s1);

(别忘了在第二个中释放s1)