gpt4 book ai didi

C - 为链表节点分配动态内存时出错

转载 作者:行者123 更新时间:2023-12-04 09:39:04 25 4
gpt4 key购买 nike

我正在尝试编写一个代码,将文本文件读取到链表并存储在内存中。我不知道为什么我在代码中使用的 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 文件加载到内存中的代码:

条目的格式为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 有两个指针和一些其他成员,但您只为一个指针分配了空间。这将导致典型环境中的空间运气和超出范围的访问。
  • 分配内存,以实现定义的方式将其转换为某个整数并使用它来初始化一个 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);

注意这里省略了错误检查。添加它们使程序更安全。

关于C - 为链表节点分配动态内存时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37042323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com