嗨,我对C编程还是一无所知。实际上,我正在研究列表,并尝试使用以下代码来理解它们的行为。当我编译它并到达终端时,它会以一个奇怪的值从终端退出,该值不是1,就好像"malloc(("没有创建正确的指针一样。我没有得到最后一个"printf(("的文本,以防程序运行良好。通过调试它,我得到了一个"segmentation fault(core dumped("错误和一个"p is nullptr"异常。我最初制作了一个更复杂的代码,但它给出了这个错误,然后我决定将其简化为这个基本代码来查找错误。我确信我误解了结构指针后面的逻辑。
#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("nn");
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("successnn");
}
在将内存传递给函数之前,先将内存分配给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);