C 指针数组的意外行为
我目前正在C上实现一个基本的链表结构 基本上我在解析一个txt文件,我将每一行缓冲到一个节点中,该节点包含一个指向整数数组的指针。问题是,我的数据(整数数组)没有正确保存/我不知道如何正确地遍历它 以下是我使用的结构:C 指针数组的意外行为,c,pointers,C,Pointers,我目前正在C上实现一个基本的链表结构 基本上我在解析一个txt文件,我将每一行缓冲到一个节点中,该节点包含一个指向整数数组的指针。问题是,我的数据(整数数组)没有正确保存/我不知道如何正确地遍历它 以下是我使用的结构: typedef struct Node { struct Node* next; struct Node* prev; int* data; int len; } Node; typedef struct LinkedList {
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:torealloc
“安全地”,您可以使用MyType*NewPointer=realloc(oldpoint,NewSize);if(!NewPointer){在此处执行错误处理,例如向stderr写入错误消息并终止程序。}OldPointer=NewPointer代码>。尽管如此,如果错误处理只包括报告错误和终止程序,那么使用data=realloc(data,dataIndex+1)并不重要代码>在典型系统中,因为当程序终止时,操作系统将回收所有内存。(实际上,“清理”纯粹是程序内部的东西是浪费的。)