Установите указатель на значение NULL после использования в функции - PullRequest
0 голосов
/ 22 апреля 2019

В C, у меня есть функция, в которой я получаю строку в качестве параметра, а затем, после ее использования, я хочу уничтожить ее, потому что мне приходится вызывать ее в бесконечном цикле и получать Процесс вернул -1073741819 (0xC0000005) через 5 минут.

Вот моя функция:

void renderText(char *text) {
    //use it here and then destroy it.
    *text = NULL; //not working!
    text = NULL; //also not!
    text[0] = '\0'; //also not!
}

Передавая аргумент как:

renderText("Hello There!");

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

Ответы [ 2 ]

6 голосов
/ 22 апреля 2019

Эта строка

text[0] = '\0';

будет разыменовывать указатель text, но у вас уже есть

text = NULL;

, так что это, вероятно, вызовет ошибку сегмента.Вы можете

free(text);

, но, вероятно, лучше позволить вызывающему абоненту быть ответственным за это.Это делает функцию более полезной для аргумента, который был не динамически выделен, или который вызывающий абонент хочет использовать снова.

Однако вы используете

renderText("Hello There!");

и строковый литерал не может быть изменен: он только для чтения.Таким образом, ваша функция не должна пытаться уничтожить переданный аргумент.

2 голосов
/ 22 апреля 2019

Здесь

void renderText(char *text) { }

text имеет тип char* и после его использования, чтобы не указывать text на какое-либо недопустимое место в памяти, всегда лучше инициализироватьс NULL, что означает, что он ничего не указывает.Следовательно, это

text = NULL;

правильно только в этом API, поскольку оно не отражает присваивание NULL в вызывающей функции, поскольку text локально создается в этой функции.Этот

*text = NULL;

недопустим, поскольку *text имеет тип char, а NULL эквивалентен (void*)0.

This

text[0] = '\0';

Работает нормально, если обработка ошибок соответствует приведенному выше утверждению.Например,

if(strlen(text) != 0) { /* something is there inside text */ }

...