2016-01-15 5 views
1

У меня есть этот список, и я пишу функцию, чтобы попросить пользователя, чтобы добавить информацию:Как присвоить значения списка в C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXTAB 40 
#define MAXSTR 25 

typedef enum {Prob, Impr, Terr, Jail} Type; 

typedef struct { 
    int pos; 
    char name[MAXSTR+1]; 
    char owner[MAXSTR+1]; 
    int price; 
    Type info; 
} Casella; 

struct lista { 
    Casella Tab; 
    struct lista *node; 
}; 

typedef struct lista Lista; 

void printElement (Lista *); 
void printTab (Lista *); 
Lista * initializeTab (Lista *, int); 
Lista * addInfo (Lista*); 

int main() 
{ 
    Lista *list = NULL; 
    int i; 

    for (i=0; i<MAXTAB; i++){ 
     list = initializeTab(list, i); 
    } 

    printTab(list); 

    return 0; 
} 

void printElement (Lista *l){ 

    printf("Position: %d\n", l->Tab.pos); 

} 

void printTab (Lista *l){ 

    while(l!=NULL){ 
     printElement(l); 
     l=l->node; 
    } 

} 

Lista * initializeTab (Lista *l, int x){ 

    Lista *newTab = NULL; 

    newTab = (Lista*)malloc(sizeof(Lista)); 

    newTab->Tab.pos = x; 
    newTab->node = l; 

    return newTab; 

} 

Lista * addInfo (Lista *l){ 
    Lista *list = NULL; 
    list->Tab.name = (char*)malloc(MAXSTR * sizeof(char)); 
    return list; 
}` 

В функции «addInfo», я стараюсь выделить памяти для имени вкладки, но он говорит мне, что я не могу назначить массив массива типов. Мой вопрос: как мне выделить память для различных элементов списка? Как я хочу выделить память для list.name, then list.owner, list.pos и т. Д. ... и затем присваивать им значения.

+0

Используйте указатель, а не массив, для переменной, которую нужно назначить. – MikeCAT

+1

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

ответ

1

Массивы в не являются записываемые lvalues ​​, чтобы достичь того, что вы хотите, вы должны использовать указатель вместо этого, изменить определение структуры к этому

typedef struct { 
    int pos; 
    char *name; 
    char *owner; 
    int price; 
    Type info; 
} Casella; 

Кроме того, вы malloc() и указатель указывает на действительный неинициализированным памяти, так что если вы попытаетесь читать из него неопределенное поведение будет происходить, попробуйте изменить функцию addInfo() на что-то вроде этого

Lista * 
addInfo (Lista *lista, const char *const name) 
{ 
    lista->Tab.name = strdup(name); 
    return lista; 
} 

Еще одна очень важная ошибка состоит в том, что вы установили list в NULL внутри addInfo(), а затем немедленно разыменования его, что, безусловно, неопределенное поведение и наиболее вероятным результатом является то, что программа зависнет.

3

В вашем определении структуры

struct { 
    int pos; 
    char name[MAXSTR+1]; //array 
    char owner[MAXSTR+1]; //array 
    int price; 
    Type info; 
} Casella; 

name и owner массивы, и у них уже есть [MAXSTR+1] элементов каждый. Вам не нужно выделять память, используя malloc(). Просто сделайте strcpy().

Кроме того, pos является целым числом, просто присвойте значение, используя =. Этого должно хватить.

Где вам нужно выделить память, это list, что является указателем. Что-то вроде

Lista *list = malloc(sizeof*list); //and a NULL check later 

требуется на первом месте.

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