2016-10-03 2 views
-2

Это мой код на C++.
По мне, это должно дать выход:
а
Garbage
а

Но он дает выход:
а
мусора
мусорВ функции char **() динамическое распределение массива char дает нежелательный результат

#include<bits/stdc++.h> 
using namespace std; 


char **func() 
{ 
char* PA = new char[10]; 
PA[0]='a'; 
PA[1]='b'; 
PA[2]='c'; 
PA[3]='\0'; 

printf("%s\n",PA); 
printf("Garbage\n"); 

char **PPA = &PA; 
return PPA; 

} 

int main() 
{ 
printf("%s\n",*func()); 
return 0; 
} 

Где я делаю неправильно ?

+3

Вы возвращаете адрес локальной переменной 'PA'. – mch

+0

Возвращаемый локальный адрес переменной UB. Период. –

+0

http://stackoverflow.com/q/31816095/560648 –

ответ

3
char **PPA = &PA; 

Извлекает адрес переменной PA itsself, которая является автоматической переменной и выходит из области видимости, как только функция завершается. Это означает, что у вас есть неопределенное поведение. Стандарт C не гарантирует никакого последовательного поведения, поэтому может случиться что-то, в том числе и то, что вы испытали.

Чтобы исправить это, вы можете сменить прототип функции на char* func() и сразу вернуть PA и полностью удалить PPA.

+1

Или, поскольку предполагается, что это C++, используйте std :: string – Peter

+0

Согласитесь с Питером - очень самонадеянно. C++ является объектно-ориентированным, C ориентирован на указатель. – MSalters

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