簡體   English   中英

將值存儲到C中的雙向鏈表

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

這有優點

  1. 在C語言中,不需要對malloc()進行malloc()
  2. 通過使用sizeof *pointer而不是sizeof(element_type) ,獲得錯誤類型的機會減少了,就像OP在這篇文章中所做的那樣,並且在類型更改時也沒有太多更新的機會。
  3. 通過首先使用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數學。
  4. 始終檢查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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM