2016-10-05 3 views
3

Я хочу знать, как назначить структуру, содержащую массив int, в массив структур. Я продолжаю получать неверный результат независимо от того, какое новое решение я думаю.Как правильно назначить структуру, содержащую массив int, в массив struct?

Я считаю, что проблема лежит в этой части кода:

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

Весь код:

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

struct Codes { 
    int as; 
    int a[]; 
}; 

struct Code { 
    int as; 
    struct Codes *ci[]; 
}; 

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

struct Code *and(int as, struct Codes *cd) { 
    struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes)); 
    for (int i = 0; i < as; i++) { 
     c->ci[i] = cd; 
    } 
    c->as = as; 
    return c; 
} 

int main(int argc, char **argv) { 

    struct Codes *cd; 
    cd = create(4); 

    struct Code *c; 
    c = and(2, cd); 

    for (int i = 0; i < c->as; i += 1) { 
     for (int j=0; j < c->ci[i]->as; j++) { 
      printf("%d \n", c->ci[i]->a[j]); 
     } 
    } 

    free(cd); 
    free(c); 

}//main 

Фактический результат:

0 
1 
2 
3 

Ожидаемый результат:

0 
1 
2 
3 
0 
1 
2 
3 
+1

Было бы неплохо узнать, как использовать отладчик и уметь самостоятельно находить эти вещи, проверяя значения переменных по мере запуска вашей программы. –

+0

Простите, я не знаю, как я это испортил, и спасибо за помощь. –

ответ

1

struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes)); неверен. Строка кода Code - это массив указателей, но вы выделили пространство для массива структур.

Чтобы это исправить, либо изменить к sizeof(struct Codes *), или предпочтительно использовать шаблон разыменования указателя к типу вы выделения места для:

struct Code *c = malloc(sizeof *c + as * sizeof c->ci[0]); 

Кроме того, for (int j; должен быть for (int j = 0;. Ваш код вызывает неопределенное поведение, используя неинициализированное значение j, это просто шанс, что вам удалось получить результат, который вы сделали. Использование gcc-флага -Wextra могло бы диагностировать эту ошибку.

Смежные вопросы