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

问题描述 投票:0回答:2

嗨,我仍然对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");
}
c list nullpointerexception segmentation-fault malloc
2个回答
1
投票

将内存传递给函数之前,将其分配给p。

此外,在main()中释放p,但在free(p->v)之后。


0
投票

第一个解决方案,可以在调用函数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);
© www.soinside.com 2019 - 2024. All rights reserved.