2015-02-02 1 views
0

Одноклассник имел такую ​​функцию:Этот массив символов возвращает неопределенное поведение?

char* Func(int a) 
{ 
    if(a == 0) 
     return "yes"; 
    else 
     return "no"; 
} 

Я знаю, что вернуть локальный символ * не определен, но, когда я спросил его, он сказал, что так как «да» и «нет» не был объявлен как переменная это не было неопределенное поведение.

Кто такой? И почему?

+1

Это должно быть 'cons t char * ', но кроме того, это приемлемо. Он прав; возвращаемый адрес остается действительным, а код в противном случае корректно сформирован. – WhozCraig

+0

Вы ответили, что я хотел знать в ответе на удаление. (То, что «да» является строковым литералом, имеет статическое время жизни переменной. Спасибо. – Aulaulz

ответ

1

Здесь нет локального массива, показанный код четко определен.

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

char *func(int a) 
{ 
    char b[10]; 
    char *p = b; 
    if(a == 0) 
    return p; 
} 

Здесь есть ошибка, и я думаю, что компилятор сообщит/предупредить его, так как вы возвращаете ссылку на локальный array.The жизнь массива b только в func() и при выходе из функции, на массив недействителен.

-1

Ваш код работает отлично, вот что я пробовал:

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

char* Func(int a) 
{ 
    if (a == 0) 
     return "yes"; 
    else 
     return "no"; 
} 

int main(int argc, char *argv[]) 
{ 
    char a[5] = { 0, }; 
    strcpy(a, Func(0)); 
    printf("returned %s",a); 
    return 0; 
} 

это дало результат: returned yes


и

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

char* Func(int a) 
{ 
    if (a == 0) 
     return "yes"; 
    else 
     return "no"; 
} 

int main(int argc, char *argv[]) 
{ 
    char a[5] = { 0, }; 
    strcpy(a, Func(1)); 
    printf("returned %s",a); 
    return 0; 
} 

дал результат: returned no

+1

Будьте осторожны, что «работающий штраф» является членом неопределенного поведения. – tia

+0

@tia, спасибо, здесь я попытался передать, что зависящее от его использования в вызывающей функции ('main()' в этом примере), а не сама функция 'Func()', как упоминалось в его вопросе. –