2013-08-17 7 views
-3

Следующий код - это интервью qusetion, и я не могу понять результат. Может ли кто-нибудь помочь? Благодарю.Каков результат следующего кода и почему?

#include <stdio.h> 

    char* string_1() 
    { 
     char* p = "ABCD"; 
     return p; 
    } 

    char* string_2() 
    { 
     char p[] = "ABCD"; 
     return p; 
    } 

    int main(void) 
    { 
     printf("%s\n",string_1()); 
     printf("%s\n",string_2()); 
    } 
+0

Что такое выход? Что вы ожидаете от выхода? – lulyon

+5

Первый - это ABCD, как ожидалось, второй - Undefined Behavior, поскольку вы возвращаете локальную переменную, которая вышла за рамки. –

+0

@PaulR: Почему бы не написать свой комментарий в ответе? – alk

ответ

4

Первый - это ABCD, как ожидалось, второй - это неопределенное поведение, поскольку вы возвращаете локальную переменную, которая вышла за рамки.

+1

Обратите внимание, что первым не обязательно будет ABCD. Если программа вызывает неопределенное поведение, относящееся ко всему ** коду **, и абсолютно никаких требований нет, даже до того, как поток управления достигнет ошибочной части. –

2

что выходной сигнал

Мы не знаем. Любой выход действует ...

и почему

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

1

Первого один дает ABCD в качестве выходного сигнала, потому что

char* p = "ABCD"; 

В приведенном выше ABCD заявления является строка символов, следовательно, сохраняется в считанных только memory.The начиная сумматоры получает назначение на р, который возвращается к основному .Hence ABCD печатается.

В то время как здесь

char p[] = "ABCD"; 

ABCD не строка literal.It присваивается локальной variable.As мы знаем масштабы локальной переменной функции body.Here вы возвращаете локальную переменную, приводит к неопределенному поведению.

+0

Означает ли это, что буквальная строка копируется в локальную переменную p при вызове второй функции (если мы игнорируем негенерированный код путем оптимизации)? – ChronoTrigger

+1

@ Chrono Trigger да. – Light

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