[英]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.