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
相关产品推荐
相关产品推荐

