C 指针数组的意外行为

C 指针数组的意外行为,c,pointers,C,Pointers,我目前正在C上实现一个基本的链表结构 基本上我在解析一个txt文件,我将每一行缓冲到一个节点中,该节点包含一个指向整数数组的指针。问题是,我的数据(整数数组)没有正确保存/我不知道如何正确地遍历它 以下是我使用的结构: typedef struct Node { struct Node* next; struct Node* prev; int* data; int len; } Node; typedef struct LinkedList {

我目前正在C上实现一个基本的链表结构

基本上我在解析一个txt文件,我将每一行缓冲到一个节点中,该节点包含一个指向整数数组的指针。问题是,我的数据(整数数组)没有正确保存/我不知道如何正确地遍历它

以下是我使用的结构:

typedef struct Node
{
    struct Node* next; 
    struct Node* prev; 
    int* data; 
    int len; 
} Node;

typedef struct LinkedList
{
    Node* head; 
    Node* tail; 
} LinkedList;
我使用此方法从缓冲字符串创建一个新节点:

int nodeManager(FILE* filePointer, char* buffer, char* token, LinkedList* linkedList)
{
    token = strtok(buffer, DELIMITER);
    int* data = (int*)malloc(sizeof(int));
    int dataIndex = 0;
    if (data == NULL)
    {
        fprintf(stderr, DATA_ALLOCATION_ERROR);
        freeLinkedList(linkedList);
        fclose(filePointer);
        return EXIT_FAILURE;
    }
    const char* insertPosition = token;
    while ((token = strtok(NULL, DELIMITER)))
    {
        data = realloc(data, dataIndex + 1);
        if (data == NULL) {
            fprintf(stderr, DATA_ALLOCATION_ERROR);
            freeLinkedList(linkedList);
            fclose(filePointer);
            return EXIT_FAILURE;
        }
        char *res;
        int num = (int) strtol(token, &res, 10);
        data[dataIndex] = num;
        dataIndex++;
    }
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL)
    {
        freeLinkedList(linkedList);
        free(data);
        fclose(filePointer);
        return EXIT_FAILURE;
    }
    newNode -> prev = NULL; newNode -> next = NULL;
    newNode -> len = dataIndex; newNode -> data = data;
    if(strcmp(insertPosition, INSERT_TO_START) == 0)
    {
        addToStartLinkedList(linkedList, newNode);
    }
    else
    {
        addToEndLinkedList(linkedList, newNode);
    }
    return EXIT_SUCCESS; // TODO - Change
}
一行输入如下所示:

start,1,2,3,4,5,6,7,10,22,44,55,66,66,77
  for (int i = 0; i < newNode -> len; i++)
    {
        printf("%d,", (newNode -> data)[i]);
    }
由于某种原因,
node->data
没有得到我在这个方法中分配的所有值,我真的不知道为什么

我试图打印如下值:

start,1,2,3,4,5,6,7,10,22,44,55,66,66,77
  for (int i = 0; i < newNode -> len; i++)
    {
        printf("%d,", (newNode -> data)[i]);
    }
for(int i=0;ilen;i++)
{
printf(“%d”,(newNode->data)[i]);
}
但是,正如我所说的,我的assigment有些不太好用,或者我只是不知道如何正确地访问这些值

我很想了解一些情况-谢谢。

这部分是错误的:

data = realloc(data, dataIndex + 1);
您忘记了使用
sizeof(int)
或更好的
sizeof*p

顺便说一句:注意不要将
realloc
直接插入
数据中。失败时,
realloc
可能返回NULL,然后内存泄漏。您应该使用临时指针,如:

int * temp = realloc(data, SOME_SIZE); 
if (temp == NULL) 
{  
    // oh dear, add error handling here - maybe a return or whatever fits
} 
else 
{ 
    // All good
    data = temp; 
}

OT:将文件指针传递给函数以便能够关闭文件(IMO)是一种非常奇怪的设计。相反,调用方应该检查返回值并关闭文件(如果需要)。

非常感谢!您能告诉我如何以更安全的方式进行realloc吗?@WillyCboi:to
realloc
“安全地”,您可以使用
MyType*NewPointer=realloc(oldpoint,NewSize);if(!NewPointer){在此处执行错误处理,例如向stderr写入错误消息并终止程序。}OldPointer=NewPointer。尽管如此,如果错误处理只包括报告错误和终止程序,那么使用
data=realloc(data,dataIndex+1)并不重要在典型系统中,因为当程序终止时,操作系统将回收所有内存。(实际上,“清理”纯粹是程序内部的东西是浪费的。)