2016-04-07 3 views
0

я задавался вопросом, если это возможно, чтобы инициализировать строку с пустой строкой, как это:Инициализация строки с пустой строкой

#include <stdio.h> 
#include <string.h> 

char* some_function() { 
    char* w = malloc(100*sizeof(char)); 
    w = ""; 
    if (1 == 2) { 
     w = "Not empty anymore"; 
    } 
    return w; 
} 

int main(void) { 

    char* word = some_function(); 
    int r = strcmp("", word); 

    printf("%s\n", word); 
    printf("%d\n", r); 
    return 0; 
} 

Он отлично компилируется и дает мне результат я хочу, но я нахожусь все еще совершенно новый на C и задавался вопросом, не приведет ли это к каким-либо проблемам на линии. Также мое использование strcmp для сравнения слова с "" нормально?

+0

В коде, что 'if (1 == 2)' представляет? –

+0

Я просто положил это так, чтобы оператор if был ложным и не выполнялся, поэтому возвращаемая строка - это пустая строка. В основном мне интересно, нормально ли инициализировать пустую строку и вернуть ее в функцию. В действительности, оператор if может быть или не быть правдой, заканчивая функцией, возвращающей пустую строку или строку «Больше не пустая». – PCR

+0

Не рекомендуется делать это, вместо выполнения инициализации, как описано выше, вы можете использовать 'strcpy() '. –

ответ

3

Ну, это возможно, но оно не будет вести себя так, как вы ожидаете. И в более поздних версиях C это неопределенное поведение.

То, что вы сделали, было выделение памяти, а затем выбросить указатель, пропуская эту память. Вы заменили указатель на непостоянный указатель на строковый литерал (который должен заставить ваш компилятор выпустить предупреждение или ошибку).

Это случилось с вашим делом. К счастью, вы не пытались писать в эту память. Если бы вы это сделали, скорее всего, это случится.

+0

", который должен заставить ваш компилятор выпустить предупреждение или ошибку_" - в C, 'const' не требуется. Предупреждений не будет. (Я знаю, что 'const' * * настоятельно рекомендуется при указании на строковый литерал). –

2

О, о! Вы выделить память для строки и хранить ручку на выделенную память в w:

char* w = malloc(100*sizeof(char)); 

В следующей строке, вы перезаписать, что ручка с непреложной строкового литерала:

w = ""; 

Это означает, что (1) вы больше не можете освобождать w, как вам следует после использования, и (2), что w теперь указывает на строку в постоянной памяти, модификация которой приведет к неопределенному поведению, скорее всего, к сбою.

Динамически выделяемая память ведет себя как массив. Строки C представляют собой массивы символов, которые содержат действительные символы строки до нулевого терминатора, '\0'. Там первый план установки первого символа в нулевой символ даст вам пустую строку:

*w = '\0'; 

или

w[0] = '\0'; 

В мертвой ветви, вы хотите, чтобы заполнить массив символов с содержимым string, но вы также назначаете литерал только для чтения. Вы можете использовать функцию strcpy из <string.h> заполнить массив символов со строкой:

strcpy(w, "Not empty anymore"); 

Вы должны убедиться в том, однако, что массив достаточно велик, чтобы держать строку плюс завершающий нулевой символ.

+0

А, я вижу. Мое использование strcmp ("", word) нормально? – PCR

+1

Да. Для 'strcmp' не имеет значения, является ли строка только для чтения или нет, потому что' strcmp' проверяет только строку. Когда вы создаете свой собственный символ строк по символу, убедитесь, что строка имеет нулевой ограничитель '' \ 0'' в конце. И когда вы выделяете память для строки, убедитесь, что есть место для дополнительного нулевого символа. В вашем случае строка может содержать 99 символов плюс нулевой символ. –

Смежные вопросы