[英]storing value to doubly linked list in C
我有一個雙鏈表數據結構,格式正確,因為我已經在不同的輸入上對其進行了測試。
但是,這是我遇到問題的一段代碼。 我正在嘗試從文件中讀取一行字符串,並通過將它們轉換為稱為num的整數數組中的整數來存儲值。 此處的代碼很好,因為我已打印出條目並檢查了它們。 但是當我嘗試將它們存儲到雙向鏈表中時,我得到的所有值都是正確的,除了第二個值是任意長整數。 我的代碼和輸出如下:
num_read是一個函數,該函數讀取雙鏈表中的所有值,並將num數組及其長度作為參數。
#include "DlistInterface.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Dnode *num_read(int *,int *);
int main(){
Dnode *number;
int num[100];
char a[10];
char *lineptr = NULL;
int j = 0;
int i = 0;
int index = 0;
size_t len;
ssize_t read;
FILE *fp;
fp = fopen("Dlist_v_array.txt","r");
while ((read = getdelim(&lineptr,&len,32,fp)) != -1){
i = 0;
index = 0;
while (1){
if ((lineptr[i] == ' ') || (lineptr[i] == '\n')) break;
else a[index++] = lineptr[i++];
}
a[index] = '\0';
num[j] = atoi(a);
printf("%d ",num[j]);
j++;
}
//printf("\n %d",j);
printf("\n");
fclose(fp);
free(lineptr);
number = num_read(num, &j);
while (number != NULL){
printf("%d ",number->data);
number = number->next;
}
printf("\n");
return 0;
}
Dnode *num_read(int *n, int *len){
int k;
for (k=1; k< *len;k++){
//printf("%d ",n[k]);
}
printf("\n");
Dnode *number = (Dnode *)malloc(sizeof(Dnode *));
number->data = n[0];
number->next = NULL;
number->prev = NULL;
Dnode *another_node;
Dnode *temp;
another_node = number;
k = 1;
while(k < *len){
temp = (Dnode *)malloc(sizeof(Dnode));
temp->data = n[k++];
temp->next = NULL;
another_node->next = temp;
temp->prev = another_node;
another_node = temp;
}
return number;
}
我將其作為輸出:12 21 33 4 5 6 7 8 9
12 -2109715456 33 4 5 6 7 8 9
輸出的第一行是因為驗證了在數字數組中讀取的值,該值根據.txt文件中的值是正確的。
但是,下一行上的相同值將其對應的第二個條目設為一個怪異的數字,無論我做什么,這都是它們的始終。
我迫切需要這一方面的幫助。 我將非常感謝大家的幫助。 請幫忙!!!
@BLUEPIXY分配的內存量不正確。
// Dnode *number = (Dnode *)malloc(sizeof(Dnode *));
Dnode *number = (Dnode *)malloc(sizeof(Dnode));
為了避免將來出現此錯誤,並創建更簡單的原始代碼和可維護代碼,請使用;
// pointer = malloc(sizeof *pointer * number_elements)
Dnode *number = malloc(sizeof *number); // number_elements == 1 in OP's case
// check pointer
if (number == NULL) return NULL; // detect and handle out-of-memory somehow
這有優點
malloc()
進行malloc()
。 sizeof *pointer
而不是sizeof(element_type)
,獲得錯誤類型的機會減少了,就像OP在這篇文章中所做的那樣,並且在類型更改時也沒有太多更新的機會。 sizeof()
,至少在size_t
數學中計算內存需求。 對於大型程序,這變得很重要:考慮int h,w; malloc(sizeof *pointer*h*w)
int h,w; malloc(sizeof *pointer*h*w)
與malloc(h*w*sizeof *pointer)
,其中h*w
溢出了int
數學,但不是size_t
數學。 始終檢查out-of-memory
是否out-of-memory
。 至少,您至少知道,它可以節省調試時間,並且可以分配適當的內存。 注意:在某些系統上,如果number_elements
為0( sizeof *pointer * number_elements
),則分配0字節可能會返回NULL
,這不是內存不足的情況。
pointer = malloc(sizeof *pointer * number_elements) if (pointer == NULL && number_elements > 0) Handle_OOM();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.