Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-为链表节点分配动态内存时出错_C_Malloc_Dynamic Memory Allocation - Fatal编程技术网

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

C-为链表节点分配动态内存时出错,c,malloc,dynamic-memory-allocation,C,Malloc,Dynamic Memory Allocation,我正在尝试编写一个代码,将文本文件读取到链接列表并存储在内存中。我不知道我在代码中使用的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 str

我正在尝试编写一个代码,将文本文件读取到链接列表并存储在内存中。我不知道我在代码中使用的
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;
}
这是创建节点的函数,我发现错误:

指向整数转换的指针不兼容,该转换从“char*”分配给“char”,已用取消引用*

请有人能解释一下这个错误。多谢各位

  • 他们说
  • 不能将数组赋值,在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;
}
tokens = strtok(entry, ", ");
aNode->id = atoi(tokens);

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

tokens = strtok(NULL, ", ");
strcpy(aNode->telephone, tokens);
strcpy()
函数可在
string.h
中用于复制字符串,而
atoi()
函数可在
stdlib.h
中用于将字符串转换为整数。使用这些选项,将数据分配给成员的部件应如下所示:

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;
}
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);
因为当您声明它们时,内存已经分配。 您只需要为链接列表节点分配内存,如:

TelephoneBookNode * createTelephoneBookNode()
{
    Telephonenter code here`eBookNode* aNode;

    aNode = (TelephoneBookNode*) malloc(sizeof aNode);

    return aNode;
}
  • int id是一个整数而不是指针,因此不需要malloc
  • 两者都是固定大小的字符数组,不需要malloc
  • 仅对节点可以执行malloc,这就足够了

注意:他们说。难道不是整数吗?如何将堆内存分配给整数
阳极是一个指针,其大小肯定与
电话簿节点的大小不同。这就给了我一个建议。很少需要用C语言来表达,即使是这样,也只有那些懂C语言、认真理解他们在做什么、谦虚到承认容易犯错的人才能做到。对于一个不熟悉这门语言的人来说,它应该像死亡瘟疫一样被避免。我敢说,所有学习级别项目所需的要求和语言资源不应该需要它。如果您发现自己编写的代码没有它就无法编译,请将其视为一个强烈的提示,您可能正在做一些非常非常错误的事情。
createTelephoneBookList
中还有一个关于变量
aList
的错误。