Неспособный к свободным указателям константы в C

Как я могу освободить a const char*? Я выделил новое использование памяти malloc, и когда я пытаюсь освободить его, я всегда получаю ошибку "несовместимый тип указателя"

Код, который вызывает это, является чем-то как:

char* name="Arnold";
const char* str=(const char*)malloc(strlen(name)+1);

free(str); // error here
65
задан Brian 19 November 2015 в 22:37
поделиться

7 ответов

Несколько человек опубликовали правильный ответ, но они продолжают удалять его по какой-то причине. Вам нужно привести его к неконстантному указателю; free принимает void*, а не const void*:

free((char*)str);
82
ответ дан 24 November 2019 в 15:25
поделиться

Я могу ошибаться, но думаю, что проблема в const . Преобразуйте указатель в неконстантный вид:

free((char *) p);

Потому что с const вы говорите: Не изменяйте данные, которые этот указатель указывает на .

1
ответ дан 24 November 2019 в 15:25
поделиться

Я думаю, даже если вы приведете указатель к неконстантной, результат свободной воли будет зависеть от реализации. Обычно const была разработана для переменной, которую вы не хотите изменять !!

-2
ответ дан 24 November 2019 в 15:25
поделиться

Нет смысла назначать указатель на const, так как вы не сможете изменить его содержимое (без уродливых хаков).

FWIW, gcc просто предупреждает о следующем:

//
// const.c
//

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const char *p = malloc(100);

    free(p);
    return 0;
}

$ gcc -Wall const.c -o const
const.c: In function ‘main’:
const.c:8: warning: passing argument 1 of ‘free’ discards qualifiers from pointer target type
$ 

Какой компилятор вы используете?

6
ответ дан 24 November 2019 в 15:25
поделиться

Ваш код перевернут.

Это:

char* name="Arnold";
const char* str=(const char*)malloc(strlen(name)+1);

Должно выглядеть так:

const char* name="Arnold";
char* str=(char*)malloc(strlen(name)+1);

Тип хранения const сообщает компилятору, что вы не собираетесь изменять однажды выделенный блок памяти (динамически или статически). Освобождение памяти меняет его. Обратите внимание, что вам не нужно приводить возвращаемое значение malloc () , но это только в сторону.

Нет смысла в динамическом распределении памяти (что вы делаете, исходя из длины name ) и сообщении компилятору, что вы не собираетесь ее использовать. Обратите внимание: использование означает запись чего-либо в него и последующее (необязательно) освобождение позже.

Приведение к другому типу хранилища не устраняет того факта, что вы изначально поменяли типы хранилищ :) Это просто удаляет предупреждение, которое пытается вам что-то сказать.

Если код поменять местами (как и должно быть), free () будет работать должным образом, поскольку вы можете фактически изменить выделенную память.

24
ответ дан 24 November 2019 в 15:25
поделиться

Вы не можете освободить const char * , потому что это const . Сохраняйте указатели, полученные от malloc , в переменных, не являющихся константными указателями, чтобы вы могли передавать их бесплатно . Вы можете передавать аргументы char * функциям, принимающим аргументы const char * , но обратное не всегда верно.

void foo (const char *x);
char *ptr = malloc (...);
foo (ptr);
free (ptr);
0
ответ дан 24 November 2019 в 15:25
поделиться

Нет смысла приводить указатель malloc'd к const. Любая функция, принимающая указатель const, не должна отвечать за освобождение переданной ей памяти.

2
ответ дан 24 November 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: