C, Неверная запись с переменной valgrind и void * - PullRequest
0 голосов
/ 10 мая 2018

Я хочу присвоить переменную void * атрибуту void * из структуры. Моя структура:

struct data{
    int n;
    void * cl;
}typedef data;

Тогда у меня есть эта функция:

void f(void *cl, int n){
    struct data *data = malloc(sizeof(data));
    data->cl = cl; //"Invalid write of size 8" from valgrind
    data->n = n;
}

РЕДАКТИРОВАТЬ: "void * cl" является нулем, я не знаю почему (но не данные) И я называю это так:

f(args_f(2), 1);

Об args_f:

struct st_args * args_f(int n)
    {
        struct st_args *args = malloc(sizeof(struct st_args));
        if (args == NULL)
            return NULL;

        args->n = n;
        return args;
    }

Структура st_args:

struct st_args{
    int n;
    }typedef st_args;

Внутри моей функции f, когда я пытаюсь присвоить «data-> cl = cl;», valgrind говорит «Неверная запись размера 8» в этой строке. почему это?

1 Ответ

0 голосов
/ 10 мая 2018

Я вижу проблему здесь: struct st_args *args локально, и вы return редактируете ее, не выделяя надлежащую память.

struct data *data = malloc(sizeof(data));

В этом случае data является указателем, а malloc выделил бы 4 (или 8) байта памяти. Это должно было быть,

struct data *data = malloc(sizeof(struct data));

Это выделит (если доступно) необходимую память, и segfault исчезнет.

Кроме того, вы должны проверить, является ли data значением NULL после malloc, если да, то обработать ошибку, как вы сделали в функции args_f.

Именно по этой причине мы должны избегать соглашения об именовании переменных, в котором определяемые пользователем типы данных и имена переменных могут совпадать. Кстати, когда у меня есть typedef, у меня обычно есть суффикс _t, чтобы избежать путаницы.

Например,

Это

struct data{
    int n;
    void * cl;
}typedef data;

было бы что-то вроде этого в моем коде

typedef struct stData {
    int32_t i_N;
    void *p_cl;
} data_t;
...