【问题标题】:C - error when allocating dynamic memory for linked list nodeC - 为链表节点分配动态内存时出错
【发布时间】: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


【解决方案1】:
  • 他们说you shouldn't cast the result of malloc() in C
  • 不能赋值给数组,在 C 语言中,当用作 = 运算符的操作数时,数组将被转换为非左值指针。
  • TelephoneBookNode 有两个指针和一些其他成员,但您只为一个指针分配了空间。在典型环境中,这将导致空间运气和超出范围的访问。
  • 分配内存、以实现定义的方式将其转换为某个整数并使用它来初始化一个成员看起来很奇怪。

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

string.h 中有strcpy() 函数用于复制字符串,stdlib.h 中有atoi() 函数用于将字符串转换为整数。使用这些,将数据分配给成员的部分应该是这样的:

tokens = strtok(entry, ", ");
aNode->id = atoi(tokens);

tokens = strtok(NULL, ", ");
strcpy(aNode->name, tokens);

tokens = strtok(NULL, ", ");
strcpy(aNode->telephone, tokens);

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

【讨论】:

    【解决方案2】:

    您不需要 malloc 进行以下操作:

    aNode->id = (int) malloc(sizeof aNode->id);
    aNode->name = (char*) malloc(sizeof aNode->name);
    aNode->telephone = (char*) malloc(sizeof aNode->telephone);
    

    因为在声明它们时已经分配了内存。 您只需要为链接列表节点分配内存,例如:

    TelephoneBookNode * createTelephoneBookNode()
    {
        Telephonenter code here`eBookNode* aNode;
    
        aNode = (TelephoneBookNode*) malloc(sizeof aNode);
    
        return aNode;
    }
    

    【讨论】:

      【解决方案3】:
      • int id 是整数,不是指针,所以不需要malloc。
      • 都是固定大小的char数组,不需要malloc。
      • 只有一个节点你可以做一个 malloc 就足够了。

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多