2016-09-16 4 views
2

У меня возникают проблемы с определенным «потоком программы», который я пытаюсь реализовать.Ошибка присвоения значения элемента массива с помощью указателей

Выходной сигнал в следующем MWE должен сказать «Сумма: 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; 
} 

ответ

4

Гибкий элемент массива, это член a примера структуры, не является указателем. Его адрес вычисляется с использованием адреса структуры.

на структуру с гибким элементом массива не может быть назначена с помощью простого оператора присваивания, как это делается в вашем примере:

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); 
... 
+0

Иными словами: массив не является указателем! Каждый C-учитель должен сделать это ясно с самого первого предложения, когда дело доходит до массивов! – Olaf