C - 为链表节点分配动态内存时出错
C - error when allocating dynamic memory for linked list node
我正在尝试编写将文本文件读取到链表并存储在内存中的代码。我不知道为什么我在代码中使用的 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;
}
这是创建节点的函数,出现错误:
incompatible pointer to integer conversion assigning to 'char' from 'char*', dereferenced with *
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;
}
请有人能解释一下这个错误。非常感谢!
- 他们说you shouldn't cast the result of
malloc()
in C。
- 不能赋值给数组,在 C 中用作
=
运算符的操作数时,数组将被转换为非左值指针。
TelephoneBookNode
有两个指针和一些其他成员,但是您只为一个指针分配了 space。这将导致 space 的运气和典型环境中的超出范围的访问。
- 分配内存,以实现定义的方式将其转换为某个整数并使用它来初始化 menber 看起来很奇怪。
你的 createTelephoneBookNode()
函数应该是这样的:
TelephoneBookNode * createTelephoneBookNode()
{
TelephoneBookNode* aNode;
/* add dereference operator to get the size of what will be pointed by aNode */
aNode = malloc(sizeof *aNode);
/* do initialization of member if it is required */
return aNode;
}
strcpy()
函数在string.h
中可用以复制字符串,atoi()
函数在stdlib.h
中可用以将字符串转换为整数。使用这些,将数据分配给成员的部分应该是这样的:
tokens = strtok(entry, ", ");
aNode->id = atoi(tokens);
tokens = strtok(NULL, ", ");
strcpy(aNode->name, tokens);
tokens = strtok(NULL, ", ");
strcpy(aNode->telephone, tokens);
注意这里省略了错误检查。添加它们使程序更安全。
您不需要 malloc 以下内容:
aNode->id = (int) malloc(sizeof aNode->id);
aNode->name = (char*) malloc(sizeof aNode->name);
aNode->telephone = (char*) malloc(sizeof aNode->telephone);
因为当你声明它们时内存已经分配好了。
您只需要为 link 列表节点分配内存,例如:
TelephoneBookNode * createTelephoneBookNode()
{
Telephonenter code here`eBookNode* aNode;
aNode = (TelephoneBookNode*) malloc(sizeof aNode);
return aNode;
}
- int id 是整数,不是指针,所以不需要 malloc。
- 都是固定大小的char数组,不需要malloc。
- 只有一个节点你可以做一个 malloc,这就足够了。
我正在尝试编写将文本文件读取到链表并存储在内存中的代码。我不知道为什么我在代码中使用的 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;
}
这是创建节点的函数,出现错误:
incompatible pointer to integer conversion assigning to 'char' from 'char*', dereferenced with *
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;
}
请有人能解释一下这个错误。非常感谢!
- 他们说you shouldn't cast the result of
malloc()
in C。 - 不能赋值给数组,在 C 中用作
=
运算符的操作数时,数组将被转换为非左值指针。 TelephoneBookNode
有两个指针和一些其他成员,但是您只为一个指针分配了 space。这将导致 space 的运气和典型环境中的超出范围的访问。- 分配内存,以实现定义的方式将其转换为某个整数并使用它来初始化 menber 看起来很奇怪。
你的 createTelephoneBookNode()
函数应该是这样的:
TelephoneBookNode * createTelephoneBookNode()
{
TelephoneBookNode* aNode;
/* add dereference operator to get the size of what will be pointed by aNode */
aNode = malloc(sizeof *aNode);
/* do initialization of member if it is required */
return aNode;
}
strcpy()
函数在string.h
中可用以复制字符串,atoi()
函数在stdlib.h
中可用以将字符串转换为整数。使用这些,将数据分配给成员的部分应该是这样的:
tokens = strtok(entry, ", ");
aNode->id = atoi(tokens);
tokens = strtok(NULL, ", ");
strcpy(aNode->name, tokens);
tokens = strtok(NULL, ", ");
strcpy(aNode->telephone, tokens);
注意这里省略了错误检查。添加它们使程序更安全。
您不需要 malloc 以下内容:
aNode->id = (int) malloc(sizeof aNode->id);
aNode->name = (char*) malloc(sizeof aNode->name);
aNode->telephone = (char*) malloc(sizeof aNode->telephone);
因为当你声明它们时内存已经分配好了。 您只需要为 link 列表节点分配内存,例如:
TelephoneBookNode * createTelephoneBookNode()
{
Telephonenter code here`eBookNode* aNode;
aNode = (TelephoneBookNode*) malloc(sizeof aNode);
return aNode;
}
- int id 是整数,不是指针,所以不需要 malloc。
- 都是固定大小的char数组,不需要malloc。
- 只有一个节点你可以做一个 malloc,这就足够了。