2015-11-13 2 views
0

Я создаю программу, которая изменяет динамический массив. Он должен инициализировать массив и иметь возможность вставлять в него. После этого я не смог распечатать массив, чтобы проверить его, как бы я это сделал?C - Печать динамического массива

Кусок соответствующего кода:

typedef struct { 
    char first; 
    char second;  
} name; 

typedef struct { 
    int number;     
    name name;        
} data; 
/*points to array, number allocated, number used*/ 
typedef struct { 
    data *info;   
    size_t numof;   
    size_t numused;   
} list; 

void init(list *l) { 
    l->data = malloc(sizeof(l) * l->numof); 
    l->numused = 0; 
    l->numof = 2; 
} 

int insert(list *l, const data *dat) { 
    if (l->numused == l->numof) { 
     l->numof *= 2; 
     l->data = (int *)realloc(l->data, l->numof * sizeof(int)); 
    } 
    l->data[l->numused++] = *dat; 
    return 0; 
} 

int main(void) { 
    int i; 
    list l; 
    data list1; 
/*example info for testing*/ 
    list.number = 1234; 
    strcpy(list1.name.first, "abc"); 
    strcpy(list1.name.second, "xyz"); 
    init(&l); 
    insert(&l, list1); 
/*runs through array elements to print*/ 
    for (i=0; i < ((int)sizeof(&l)) /(int)sizeof(&l); i++) { 
     printf("%s\n", list1); 
    } 
    return 0; 
} 

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

+0

Вы пробовали какой-либо входной выход в нем? – ameyCU

+0

@ameyCU Нет, просто используйте имя примера и номер в основном, чтобы посмотреть, работает ли он. –

+0

Код, который вы отправили, не компилируется, легче найти ошибки, если вы разместите рабочий фрагмент кода. – BobRun

ответ

1
strcpy(list1.name.first, "abc"); 
strcpy(list1.name.second, "xyz"); 

Они оба будут ссылаться на неопределенное поведение, как first и second объявлены как char переменных и копировании строковых литералов к ним.

Вам необходимо объявить оба из них как массивы символов.

И это -

for (i=0; i < ((int)sizeof(&l)) /(int)sizeof(&l); i++) { 
    printf("%s\n", list1); 
} 

Вы пытаетесь напечатать структура переменной list1 с %s спецификатором, может быть, вы, как правило, для печати строк, которые вы хотели скопировать. Поэтому прямо напечатайте list1.name.first и list1.name.second в printf с указанием спецификатора %s.

И условие -

i < ((int)sizeof(&l)) /(int)sizeof(&l) 

Актерский не является необходимым, и это даст 1 так, цикл будет работать в течение 1 времени. Измените условие.

0

В вашем коде член структуры name определяется как char. Но вы пытаетесь скопировать строку в нее. Может быть, это была опечатка. Если нет, вы должны определить их как массив символов или указатель символов. Также в вашем заявлении на печать вы пытаетесь напечатать структуру data как строку. Это должно быть как -

printf("%s %s\n", list1.name.first, list1.name.second); 

Также вы назначили значение 1234 для list.number. Возможно, вы имели в виду list1.number. Параметры в вызове функции insert ошибочны. И, наконец, вы положили l->data в функции init и insert, которые должны быть l->info.

+0

Что бы я поставил в качестве второго параметра 'insert'? –

+0

Вы должны отправить указатель структуры 'data' в функцию' insert' как 2-й параметр. В этом случае это должно быть '& list1' вместо' list1' – kuro

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