You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表指针数组异常:整数数组数据未正确存储/遍历问题

问题分析与解决方案

嘿,我帮你找出了几个导致node->data无法正确保存数值的核心问题,咱们一步步来修复:

1. 内存分配大小错误(最关键的问题)

你在nodeManager里用realloc的时候犯了一个典型错误——没有乘以sizeof(int):

data = realloc(data, dataIndex + 1); // 这里错了!只分配了(dataIndex+1)字节,不是(dataIndex+1)个int的空间

每个int在大多数平台上是4字节,你只按字节数分配,导致数组空间严重不足,写入数据时直接越界破坏内存,这就是数据丢失或乱码的根源。

2. 初始内存分配的冗余与风险

你一开始先malloc(sizeof(int))分配了单个int的内存,但进入循环后立刻就realloc,这一步完全多余。而且如果输入行只有插入位置(比如start,),还会留下一个无用的内存块,后续处理容易出问题。

3. 缺少整数有效性检查

用strtol转字符串的时候,你没检查转换是否成功——如果输入的不是有效整数(比如字母、符号),会把错误的值存进数组,甚至可能导致后续逻辑崩溃。


修复后的完整代码片段

我把这些问题都修正了,你可以直接替换对应的部分:

#include <limits.h> // 需要引入这个头文件来用INT_MIN和INT_MAX

int nodeManager(FILE* filePointer, char* buffer, char* token, LinkedList* linkedList) {
    token = strtok(buffer, DELIMITER);
    int* data = NULL; // 初始化为NULL,避免冗余分配
    int dataIndex = 0;
    const char* insertPosition = token;

    while ((token = strtok(NULL, DELIMITER))) {
        // 每次扩容要分配(dataIndex+1)个int的空间,记得乘sizeof(int)
        int* temp = realloc(data, (dataIndex + 1) * sizeof(int));
        if (temp == NULL) {
            fprintf(stderr, DATA_ALLOCATION_ERROR);
            free(data); // 先释放已分配的data,避免内存泄漏
            freeLinkedList(linkedList);
            fclose(filePointer);
            return EXIT_FAILURE;
        }
        data = temp; // 用temp接收返回值,防止realloc失败丢失原指针

        char *res;
        long num = strtol(token, &res, 10);
        // 检查转换是否有效:res要指向字符串末尾,且数值在int范围内
        if (*res != '\0' || num < INT_MIN || num > INT_MAX) {
            fprintf(stderr, "Invalid integer input: %s\n", token);
            free(data);
            freeLinkedList(linkedList);
            fclose(filePointer);
            return EXIT_FAILURE;
        }
        data[dataIndex] = (int)num;
        dataIndex++;
    }

    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        free(data); // 这里要记得释放data
        freeLinkedList(linkedList);
        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);
    }

    // 调试打印,验证数据是否正确
    if (newNode->len > 0 && newNode->data != NULL) {
        printf("New node data: ");
        for (int i = 0; i < newNode->len; i++) {
            printf("%d,", newNode->data[i]);
        }
        printf("\n");
    }

    return EXIT_SUCCESS;
}

额外注意事项

  • 一定要在freeLinkedList函数里遍历每个节点,先free(node->data),再free(node),否则会造成内存泄漏。
  • 遍历节点数据的时候,先判断node->len > 0和node->data != NULL,避免空指针访问。
  • 确认DELIMITER的定义是",",如果输入行有其他分隔符(比如空格),要调整这个宏的值。

内容的提问来源于stack exchange,提问作者WillyCboi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:17:34