如何解决指针数组的异常行为
im目前在C上实现了基本的链表结构。
基本上是解析txt文件,然后将每行缓冲到一个Node中,该Node包含一个指向整数数组的指针。问题是我的数据(整数数组)未正确保存/我不知道如何正确遍历它。
这些是我使用的结构:
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,77
由于某种原因,node -> data
无法获得我在此方法中分配的所有值,而且我无法真正说出原因。
我试图打印这样的值:
for (int i = 0; i < newNode -> len; i++)
{
printf("%d,",(newNode -> data)[i]);
}
但是,正如我所说,某些事情对我的工作完全不起作用,或者我只是不知道如何正确访问值。
希望获得一些见识-谢谢。
解决方法
这部分是错误的:
data = realloc(data,dataIndex + 1);
您忘了乘以sizeof(int)
或更好的sizeof *p
顺便说一句:小心将realloc
直接放入data
中。失败时,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)将文件指针传递给该函数以能够关闭文件是一种非常奇怪的设计。相反,调用方应检查返回值并关闭文件(如果需要)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。