2015-09-02 2 views
-3

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

char *fuc(char *s) 
{ 
    char t[10]; 
    int r=0; 
    while(s[r] != '\0') 
    { 
     t[r] = s[r]; 
     r++; 
    } 
    t[r]='\0'; 
    return &t[0]; 
} 

main() 
{ 
    char s[]="abcde"; 
    char *p; 
    p=func(s); 
    puts(p); 
} 
+4

Это, по крайней мере, сотый вопрос о возвращении указателей на локальные переменные. –

+1

повторите так много вопросов по этому вопросу, почему бы вам не сделать дубликат без усилий – venki

ответ

3

В вашем fuc(), char t[10]; является локальной переменной. Как только ваша функция завершит выполнение, не существует t. Таким образом, в вызывающем, возвращаемый указатель становится недействительным.

Использование этого возвращенного указателя далее ведет к undefined behaviour.

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

Тем не менее, с логической точки зрения, внутри fuc(), вы итерация t без каких-либо проверок на границах. Перед использованием индекса вы должны проверить размер t.

Кроме того, main() не является надлежащей формой функции. По крайней мере, это должно быть int main(void).

+0

, но если я возьму 'char * z' внутри func() и поставлю 'z = t' перед циклом while, а затем 'return z;' то он работает .. Почему это работает в этом случае ?? – kashish

+0

@kashish Это не работает, это _seems_ работать. Еще одна красота UB. Пожалуйста, прочитайте связанный контент, чтобы узнать больше об этом. :) –

+0

Я получил это .. спасибо :) – kashish

2

Array t является локальным для функционирования func() поэтому, как только вы выходите из функции, вы не можете получить доступ к массиву t, что приведет к неопределенному поведению.

Вы должны выделить память в куче.

char *t = malloc(10); 

Теперь вы можете вернуть указатель из функции func()

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