【问题标题】:How to assign values to a list in C如何将值分配给C中的列表
【发布时间】:2016-01-15 11:42:06
【问题描述】:

我有这个列表,我正在编写一个函数来要求用户添加信息:

#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”中,我尝试为选项卡名称分配内存,但它告诉我无法为其分配类型数组 char。我的问题是,如何为各种列表元素分配内存?就像我想为 list.name 分配内存,然后是 list.owner、list.pos 等......然后为它们分配值。

【问题讨论】:

标签: c arrays pointers malloc dynamic-memory-allocation


【解决方案1】:

在你的结构定义中

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

首先是必需的。

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    另一个非常重要的错误是您在addInfo() 中将list 设置为NULL,然后立即取消引用它,这肯定是未定义的行为,最可能的结果是您的程序将崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2016-05-20
      • 2021-06-16
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多