Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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_Linked List - Fatal编程技术网

C中的链表,名称覆盖

C中的链表,名称覆盖,c,linked-list,C,Linked List,帮帮我,我只是个新手 我目前正在学习和练习C语言的链表。我想根据乐器的大小排列它们的名称 问题是,每次我创建一个新仪器时,以前仪器的名称都会被我新创建的仪器覆盖,但大小不会被覆盖 为什么,那里发生了什么 例如,第一个乐器是“长笛”,大小为1,它将显示这些信息。但当第二个循环出现时,我输入了第二个乐器,例如,名字是“喇叭”,大小是3,“长笛”不见了。。!它将显示 名称:喇叭,尺寸:1//但尺寸仍然存在 名称:喇叭,尺寸:3 //here's my main int main(void) {

帮帮我,我只是个新手

我目前正在学习和练习C语言的链表。我想根据乐器的大小排列它们的名称

问题是,每次我创建一个新仪器时,以前仪器的名称都会被我新创建的仪器覆盖,但大小不会被覆盖

为什么,那里发生了什么

例如,第一个乐器是“长笛”,大小为1,它将显示这些信息。但当第二个循环出现时,我输入了第二个乐器,例如,名字是“喇叭”,大小是3,“长笛”不见了。。!它将显示

名称:喇叭,尺寸:1//但尺寸仍然存在

名称:喇叭,尺寸:3

//here's my main
int main(void)
{
    int add = 1;
    int size;
    char name[30];
    instrument *start = NULL;
    instrument *x = NULL;
    instrument *y = NULL;
    instrument *next = NULL;

    while(add != 0)
    {
        printf("Enter the name of the instrument: ");
        scanf(" %29s", name);

        printf("Size: ");
        scanf(" %d", &size);

        next = pos(name, size);

        if(start == NULL)
        {
            start = next;
        }

        if(x != NULL)
        {
            x->next = next;
        }

        x = next;
        //for now, I'll just display the instruments instead of sorting them.
        displayInstruments(start);

        printf("\nDo you want to add more?: ");
        scanf(" %d", &add);
    }

    freeInstruments(start);

    return 0;
}

//this is my instrument creator function
instrument* pos(char *name, int size)
{
    instrument *i = malloc(sizeof(instrument));
    i->name = name;
    i->size = size;
    i->next = NULL;

    return i;
}

//and other codes below here that don't matter for now. . . . . . . .
.
.
.
.

为每个
仪器
创建空间,但为每个仪器的名称使用相同的空间(全局变量
名称
)。

使用单个缓冲区存储每个仪器的
名称
。默认情况下,将复制
int
s,以便正确存储每个仪器的大小。但是,对于字符串,您存储一个指针,该指针保存字符串的内存位置。所有
仪器->名称
指针都指向同一内存位置,因此它们都将显示最近添加的仪器名称


要解决此问题,请将
i->name=name
更改为
i->name=strdup(name)
,这将复制字符串并创建自己的个人副本。

调用
pos(strdup(name),size)
这将创建名称的副本谢谢。现在我明白了。因此,我需要先复制名称,因为它们都指向同一地址。Tnx。但是关于函数“strdup()”创建的空间,它将去哪里?堆叠还是堆上?堆-你必须释放它(C区没有免费午餐)tnx pm100……谢谢。现在我明白了。因此,我需要先复制名称,因为它们都指向同一地址。Tnx。但是关于函数“strdup()”创建的空间,它将去哪里?堆栈还是在堆上?它将在堆上分配。tnx。。。这意味着我必须释放那些名字,对吗?是的。如果您不释放它,那么它将导致一个小内存泄漏。它不会真正影响您的应用程序,因为它很小,但是养成总是释放堆上分配的内存的习惯是一个很好的做法。