嗨,我仍然对C编程一无所知。我实际上在研究列表,并且尝试使用以下代码来了解其行为。当我编译它并到达终端时,它以不为1的奇怪值从终端退出,就好像'malloc()'没有创建正确的指针一样。如果程序运行良好,我也不会得到最后一个'printf()'的文本。通过对其进行调试,我得到了“分段错误(内核已转储)”错误,并且出现了“ p is nullptr”异常。我最初编写了一个更复杂的代码,但它给出了此错误,然后我决定将其简化为该基本代码以查找错误。我敢肯定我对struct指针背后的逻辑有误解。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *v;
int last;
int length;
} t_list;
t_list *p;
t_list list;
void makenullList(t_list *p, int dim);
int main(void) {
int dim;
printf("put dim: ");
scanf("%d", &dim);
getchar();
printf("\n\n");
makenullList(p, dim);
free(p->v);
}
void makenullList(t_list *p, int dim) {
if ((p->v = (int*)malloc(sizeof(int) * dim)) == NULL) {
printf("error");
exit(1);
}
printf("success\n\n");
}
将内存传递给函数之前,将其分配给p。
此外,在main()中释放p
,但在free(p->v)
之后。
第一个解决方案,可以在调用函数t_list list
时使用makenullList
,然后使用引用:
makenullList(&list, dim);
记住永远不会释放list
。
第二种解决方案,使用指针,但是您必须为其分配资源。在这种情况下,您必须在主要功能中分配p
,而不是在makenullList
功能中。
p = malloc(sizeof(t_list));
if(!p)
exit(-1);
永远不要像在代码中那样投射malloc
:
p->v = malloc(sizeof(int) * dim) // Do not cast (int *) here
[当您仍然不使用p时,请不要忘记释放它:
free(p->v);
free(p);