我有这个列表,我正在编写一个函数来要求用户添加信息:
#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”中,我尝试为Tab名称分配内存,但它告诉我我不能为它分配类型数组char。我的问题是,如何为各种列表元素分配内存?就像我想为list.name分配内存,然后list.owner,list.pos等......然后为它们分配值。
答案 0 :(得分: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
首先需要。
答案 1 :(得分:1)
c中的数组是不可写的 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()
,然后立即取消引用它,这肯定是未定义的行为且最有可能结果是你的程序会崩溃。