无法通过指针

时间:2016-09-16 08:13:34

标签: c pointers exc-bad-access

我遇到某个"程序流程问题"我试图实施。

以下MWE中的输出应该说" Sum:10"但它说"总和:0"因为函数set_array_element没有设置数组元素。为什么不呢?

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

typedef struct example example;
struct example {
    int nrOf;
    double a[];
};

void initialize_example_array(example *e);
void set_array_element(double *el);

example new_example(int nrOf)
{
    example *e = malloc(sizeof(example) + nrOf*sizeof(double));
    e->nrOf = nrOf;
    initialize_example_array(e);
    return *e;
}

void initialize_example_array(example *e)
{
    printf("%d\n", e->nrOf);
    for(int i=0; i<e->nrOf; i++)
    {
        set_array_element(&e->a[i]);
    }
}

void set_array_element(double *el)
{
    *el = 1;
}

int main(int argc, const char * argv[]) {
    example e = new_example(10);

    printf("%d\n", e.nrOf);

    int i, s=0;
    for(i=0; i<e.nrOf; i++)
    {
        printf("%f\n", e.a[i]);
        s+= e.a[i];
    }
    printf("Sum: %d\n", s);

    return 0;
}

1 个答案:

答案 0 :(得分:4)

灵活的数组成员,这是struct示例的成员a,不是指针。它的地址是使用struct的地址计算的。

无法使用简单赋值运算符分配具有灵活数组成员的结构,就像在您的示例中所做的那样:

example e = new_example(10);

函数返回的地方:

return *e;

你必须返回指针:

example* new_example(int nrOf)
{
    example *e = malloc(sizeof(example) + nrOf*sizeof(double));
    e->nrOf = nrOf;
    initialize_example_array(e);
    return e;
}

example* e = new_example(10);
printf("%d\n", e->nrOf);
...