结构体指针数组内存释放报错及类型不兼容警告求助
问题修复思路
错误1:成员访问符号使用错误
报错行:Vertex* ptr = (*(vertexarray+ i)).next;
原因:vertexarray是Vertex**类型,*(vertexarray + i)得到的是Vertex*指针,访问指针指向的结构体成员必须用->,而非.。
修复:改为Vertex* ptr = vertexarray[i]->next;(或等价的(*(vertexarray + i))->next;,前者可读性更强)。
警告:指针类型不兼容
警告行:finalize(vertexarray);
原因:main里的vertexarray是Vertex[4]结构体数组,传递给函数时会退化为Vertex*类型(指向第一个结构体的指针),但finalize函数参数要求的是Vertex**(指向指针的指针),二者类型不匹配。
修复有两种合理方案,任选其一即可:
方案1:修改finalize函数参数类型
将函数声明和定义的参数从Vertex** vertexarray改为Vertex* vertexarray,此时vertexarray[i]是结构体实例,访问成员用.,函数内代码对应调整为:
Vertex* ptr = vertexarray[i].next;
方案2:调整main中的数组类型(若需保留Vertex**参数)
把Vertex vertexarray[4];改为Vertex* vertexarray[4];,初始化时直接让数组元素接收initialize()的返回值:
for (i=0; i<4;i++){ vertexarray[i] = initialize(); }
这种情况下finalize函数的参数和内部代码无需修改。
完整修复代码(方案1,贴合原有代码结构)
#include <stdio.h> #include <stdlib.h> // Data structure to store a linked list node typedef struct Node { int data; struct Node* next; }Vertex; Vertex* initialize(); void finalize(Vertex* vertexarray); // 修改参数类型 Vertex* initialize(){ Vertex* node = (Vertex*)malloc(sizeof(Vertex)); if(node ==NULL){ printf("Error in initialising"); return NULL; } else{ node->data = -1; node->next = NULL; } return node; } void finalize(Vertex* vertexarray){ int i; for (i=0; i<4;i++){ Vertex* ptr = vertexarray[i].next; // 调整成员访问方式 Vertex* tmp; while( ptr!= NULL) { tmp = ptr; ptr = ptr->next; free(tmp); } } } int main(void) { Vertex vertexarray[4]; int i; for (i=0; i<4;i++){ vertexarray[i].next = initialize(); } finalize(vertexarray); return 0; }
注:当前代码仅需释放initialize分配的堆内存,vertexarray是栈上数组,无需手动释放。
内容的提问来源于stack exchange,提问作者Formal_that
相关产品推荐
相关产品推荐

