如何在 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: %dn", 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"中,我尝试为 Tab 名称分配内存,但它告诉我我无法为其分配类型数组字符。我的问题是,如何为各种列表元素分配内存?就像我想为 list.name 分配内存一样,然后是list.owner,list.pos等...,然后为它们赋值。

在你的结构定义中

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

nameowner 是数组,它们已经分别具有 [MAXSTR+1] 个元素。您无需使用 malloc() 分配内存。只是做strcpy().

此外,pos是一个整数,只需使用 = 分配值即可。这应该足够了。

需要分配内存的地方是 list ,这是一个指针。类似的东西

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

首先是必需的。

c 中的数组是不可写的左值,要实现您想要的,您需要使用指针代替,将结构定义更改为

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()然后立即取消引用它,这肯定是未定义的行为,最有可能的结果是程序崩溃。

相关内容

  • 没有找到相关文章

最新更新