Странное поведение этого простого C файла с использованием Visual Studio, который создает пустой список («ошибка сегментации (сброшено ядро)» - «nullptr») - PullRequest
0 голосов
/ 13 апреля 2020

Привет, я все еще нуб о программировании C. Я на самом деле изучаю списки, и я попытался с помощью следующего кода, чтобы понять их поведение. Когда я компилирую его и получаю в терминал, он выходит из терминала со странным значением, которое не равно 1, как если бы 'mallo c ()' не создал правильный указатель. Я не получаю текст последнего 'printf ()', если программа работала хорошо. Отладив его, я получаю сообщение об ошибке «ошибка сегментации (дамп памяти)» и исключение «p is nullptr». Первоначально я сделал более сложный код, но он выдал эту ошибку, а затем решил сократить ее до базового кода c, чтобы найти ошибку. Я уверен, что неправильно понимаю что-то о logi c за указателем структуры.

#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");
}

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Выделите память для p перед передачей ее в функцию.

Также бесплатно p в main (), но после free(p->v).

0 голосов
/ 13 апреля 2020

Первое решение, вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...