Первое объявление
char * result = "";
объявляет указатель на строковый литерал, который содержит один символ: завершающий ноль '\0'
.
Это объявление
char * result = '\0';
инициализировать указатель константой нулевого указателя и эквивалентен
char * result = NULL;
Вот демонстрационная программа
#include <stdio.h>
int main(void)
{
char *s1 = "";
char *s2 = '\0';
printf( "s1 == NULL is %s\n", s1 == NULL ? "true" : "false" );
printf( "s2 == NULL is %s\n", s2 == NULL ? "true" : "false" );
return 0;
}
Его вывод
s1 == NULL is false
s2 == NULL is true
Что касается причина ошибки, о которой вы говорите, заключается в следующем:
free(result);
Вы не можете освобождать память, занятую строковым литералом. Вы можете освободить память, которая была выделена динамически.
Когда используется указатель, инициализированный символьным литералом '\0'
, тогда такой указатель является нулевым указателем, и вы можете вызвать free
для нулевого указателя.
То есть, если у вас есть инициализированный указатель, такой как
char * result = NULL;
, такой же, как и для записи
char * result = '\0';
, тогда вы можете позвонить
free( result );
При таком вызове не будет выполнено никаких действий.
Но если вы напишите
free( "" );
, пытаясь освободить строковый литерал, имеющий стати c длительность хранения, вы получите неопределенное поведение.
И этот вызов
free( "" );
эквивалентен следующему фрагменту кода
char * result = "";
free( result );