这个简单的C文件使用Visual Studio创建一个空列表的奇怪行为('segmentation fault (core dumped)' - 'nullptr')



嗨,我对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);

相关内容

  • 没有找到相关文章

最新更新