Динамическое выделение памяти для строки константных символов с помощью malloc ()

Я пишу программу, которая читает значение из INI-файла, а затем передает значение в функцию, которая принимает PCSTR (то есть const char *). Функция getaddrinfo(),

Итак, я хочу написать PCSTR ReadFromIni(), Чтобы вернуть постоянную строку, я планирую выделить память, используя malloc() и приведение памяти к постоянной строке. Я смогу получить точное количество символов, которые были прочитаны из файла .ini.

Это техника в порядке? Я действительно не знаю, что еще делать.

Следующий пример прекрасно работает в Visual Studio 2013 и выводит «hello» по желанию.

const char * m()
{
char * c = (char *)malloc(6 * sizeof(char));
c = "hello";
return (const char *)c;
}

int main(int argc, char * argv[])
{
const char * d = m();
std::cout << d; // use PCSTR
}

4

Решение

Вторая строка «ужасно» неверна:

char* c = (char*)malloc(6*sizeof(char));
// 'c' is set to point to a piece of allocated memory (typically located in the heap)
c = "hello";
// 'c' is set to point to a constant string (typically located in the code-section or in the data-section)

Вы назначаете переменную c дважды, так что, очевидно, первое назначение не имеет смысла.
Это как писать:

int i = 5;
i = 6;

Кроме того, вы «теряете» адрес выделенной памяти, поэтому вы не сможете освободить его позже.

Вы можете изменить эту функцию следующим образом:

char* m()
{
const char* s = "hello";
char* c = (char*)malloc(strlen(s)+1);
strcpy(c,s);
return c;
}

Имейте в виду, что тот, кто звонит char* p = m()также придется позвонить free(p) в более поздний момент …

7

Другие решения

Один из способов — вернуть локальный статический указатель.

const char * m()
{
static char * c = NULL;
free(c);

c = malloc(6 * sizeof(char));
strcpy(c, "hello"); /* or fill in c by any other way */
return c;
}

Таким образом, всякий раз, когда в следующий раз m() называется, c все еще указывает на блок памяти, выделенный ранее. Вы можете перераспределить память по требованию, заполнить новый контент и вернуть адрес.

2

NO. Это не хорошо. Когда вы делаете

c = "hello";

память, выделенная malloc потерял.
Вы можете сделать как

const char * m()
{
char * c = (char *)malloc(6 * sizeof(char));
fgets(c, 6, stdin);
return (const char *)c;
}
1
А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×