[英]Use pointer to add value to linked list without using strdup() in C
我目前遇到了一个问题。 运行我的程序时,链表中的所有值都会更改为存储要添加到链表的值的指针的新值。 我发现该问题的解决方案是strdup()
,但是,由于它不是 C 标准的一部分,我想知道是否有其他方法可以在不使用strdup()
的情况下解决此问题。
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <string.h>
#define _XOPEN_SOURCE 500
struct library {
char *title;
int num_books;
struct library *next;
};
typedef struct library libptr;
void printList(struct library **head) {
while (*head != NULL) {
printf("%s\n", (*head)->title);
*head = (*head)->next;
}
}
void add_book(struct library **ptr,char value[50]){
libptr *newPtr;
libptr *prevptr;
libptr *currentptr;
newPtr = (libptr *)malloc(sizeof(libptr));
if(newPtr!=NULL){
newPtr -> title = value;
newPtr -> next = NULL;
prevptr = NULL;
currentptr = *ptr;
while(prevptr != NULL && value > currentptr->title)
{
prevptr = currentptr;
currentptr = currentptr->next;
}
if(prevptr == NULL)
{
newPtr->next = (*ptr);
(*ptr) = newPtr;
}
else{
prevptr->next = newPtr;
newPtr->next = currentptr;
}
}
else{
printf("%s is not inserted. No memory available",value);
}
}
int main(){
char title[50], line[200];
libptr *new_book = NULL;
FILE* file = fopen("library.txt", "r");
while (fgets(line, sizeof(line), file)) {
add_book(&new_book, strdup(line));
}
printList(&new_book);
fclose(file);
}
library.txt
文件的内容:
aaa
bbb
ccc
您将指针与其指向的值混淆了。 如果您从代码中删除strdup
,则链表中的所有指针最终都指向同一个 char 数组,因此如果/当您更改该 char 数组中的字符串时,所有指针都会看到它。 因此,要为链表的每个元素提供不同的字符串,每个元素的指针必须指向不同的 char 数组。
使用strdup
就是这样做的,使用malloc
创建一个大小正确的新 char 数组,并将字符串复制到该 char 数组中。 因此,每个指针最终都指向一个不同的 char 数组,每个指针(可能)都有不同的字符串。 要(安全地)摆脱 strdup,您需要以其他方式做同样的事情——为每个字符串创建一个新数组,这样您就可以让指针指向它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.