【发布时间】:2016-08-30 18:04:15
【问题描述】:
我正在尝试编写将文本文件读取到链表并存储在内存中的代码。我不知道为什么我在代码中使用的malloc 函数有错误。
这是预先给定的头文件,需要保持原样:
#ifndef ADDRESSBOOK_LIST_H
#define ADDRESSBOOK_LIST_H
#define NULL_SPACE 1
#define NAME_LENGTH (20 + NULL_SPACE)
#define TELEPHONE_LENGTH (10 + NULL_SPACE)
typedef struct telephoneBookNode
{
int id;
char name[NAME_LENGTH];
char telephone[TELEPHONE_LENGTH];
struct telephoneBookNode * previousNode;
struct telephoneBookNode * nextNode;
} TelephoneBookNode;
typedef struct telephoneBookList
{
TelephoneBookNode * head;
TelephoneBookNode * tail;
TelephoneBookNode * current;
unsigned size;
} TelephoneBookList;
这是我编写的将txt文件加载到内存中的代码:
entry 的格式为 ID, Name, Number,例如 123, Alice, 0123456789
#include "addressbook_list.h"
TelephoneBookList * createTelephoneBookList(char entry[])
{
TelephoneBookList* aList = NULL;
TelephoneBookNode* aNode = createTelephoneBookNode();
char *tokens;
tokens = strtok(entry, ", ");
aNode->id = tokens;
tokens = strtok(NULL, ", ");
aNode->name = tokens; //Error: array type char[21] is not assignable
tokens = strtok(NULL, ", ");
aNode->telephone = tokens; //Error; array type char[11] is not assignable
aNode->nextNode = aList->head;
aList->head = aNode;
if (aList == NULL)
{
aNode->nextNode = NULL;
aNode->previousNode = NULL;
aList->current = aNode;
aList->head = aNode;
aList->tail = aNode;
}
else
{
aList->tail->nextNode = aNode;
aNode->nextNode = NULL;
aList->tail = aList->tail->nextNode;
}
return aList;
}
这是创建节点的函数,我得到了错误:
从 'char*' 分配给 'char' 的整数转换指针不兼容,用 * 取消引用
TelephoneBookNode * createTelephoneBookNode()
{
TelephoneBookNode* aNode;
aNode = (TelephoneBookNode*) malloc(sizeof aNode);
aNode->id = (int) malloc(sizeof aNode->id);
aNode->name = (char*) malloc(sizeof aNode->name);
aNode->telephone = (char*) malloc(sizeof aNode->telephone);
return aNode;
}
请有人可以解释一下这个错误。非常感谢!
【问题讨论】:
-
aNode->id 不是整数吗?如何将堆内存分配给整数?
-
aNode = (TelephoneBookNode*) malloc(sizeof aNode);aNode 是一个指针,它的大小肯定和TelephoneBookNode的大小不一样 -
@AdrianM。这让我对 OP 提出了一些建议。很少需要在 C 中进行转换,即使这样,也只有在了解该语言的人手中,认真了解他们在做什么,并且谦虚地承认错误。 .对于刚接触这门语言的人来说,应该像避免死亡瘟疫一样避免它。我敢说所有学习级别项目所需的要求和语言资源不应该需要它。如果你发现自己编写的代码没有它就无法编译,请把它当作一个强烈的暗示,你可能做错了非常非常非常的事情。
-
createTelephoneBookList中还有一个关于变量aList的错误。
标签: c malloc dynamic-memory-allocation