tipo de retorno de matriz

#include #include #define MAX 30 void push(char ); char stack[MAX]; int tos=0; int main(){ char str[]="Arijit Saha"; char *final; final=(char *)rev(str); printf("%s",final); rev(str); getch(); return 1; } char* rev(char s[]){ int i; for(i=0;i<strlen(s);i++) push(s[i]); char reverse[strlen(s)]; for(i=0;i<strlen(s);i++) reverse[i]=pop(); return reverse; } void push(char c){ stack[tos]=c; tos++; } int pop(){ tos--; return stack[tos+1]; } 

Estos son los mensajes de error.

 Compiler: Default compiler Executing gcc.exe... gcc.exe "C:\TC\BIN\stringrevusingstack.c" -o "C:\TC\BIN\stringrevusingstack.exe" -g3 -I"C:\TC\INCLUDE" -I"C:\Dev-Cpp\include" -I"C:\Program Files\ImageMagick-6.7.4-Q16\include" -L"C:\Dev-Cpp\lib" -L"C:\TC\LIB" -L"C:\Program Files\ImageMagick-6.7.4-Q16\lib" -g3 C:\TC\BIN\stringrevusingstack.c:20: error: conflicting types for 'rev' C:\TC\BIN\stringrevusingstack.c:14: error: previous implicit declaration of 'rev' was here C:\TC\BIN\stringrevusingstack.c: In function `rev': C:\TC\BIN\stringrevusingstack.c:28: warning: function returns address of local variable Execution terminated 

¿Qué va mal?

c:14: error: previous implicit declaration of 'rev' was here

Su error se debe a que no generó un prototipo para rev() antes de usarlo en main() . Mueve tu función por encima de la principal o agrega un prototipo.

c28: warning: function returns address of local variable

Su advertencia es porque está intentando devolver la dirección de una variable local, no puede hacer eso. Las variables locales están fuera del scope cuando abandona la función, por lo que necesita hacer otra cosa (como usar una matriz dinámica mediante la adición de llamadas a malloc() / free() )

char reverse[strlen(s)]; está en la stack. Una vez completada la función, ya no es válida, pero está devolviendo su dirección.

Una variable que tiene una duración de almacenamiento automático ya no existe en la función de llamada. Acceder a él conduce a un comportamiento indefinido (cualquier cosa puede pasar). Aquí está regresando de rev , que es una variable local.

Más bien asigna la memoria dinámicamente:

 int *reverse = malloc(strlen(s)); /* + 1 for '\0' character ? */ 

reversa es una matriz local. Se destruye cuando la función sale, pero devuelve un puntero a su contenido. Idealmente, debería devolver la matriz al tener un parámetro en el que la función cargará datos, es decir,

 void MyFuncReturnsArray(int* myArr, int n) { for(int i = 0; i < n; ++i) myArr[i] = i; } 

En lugar de

 int* MyFuncReturnsArray() { int myArr[10]; for(int i = 0; i < 10; ++i) myArr[i] = i; return myArr } 

En este código:

 char* rev(char s[]) { char reverse[strlen(s)]; ... return reverse; } 

reverse es una matriz temporal con duración de almacenamiento automático que se desasigna una vez que la ejecución abandona el scope de esta función. Devuelves un puntero que se convierte en un puntero colgante .
Al intentar acceder a la memoria a la que apunta este puntero se produce un comportamiento indefinido .

Aparte del hecho de que debe asignarlo dinámicamente mediante el uso de malloc , tenga en cuenta que strlen devuelve la longitud de la cadena, también necesitará el espacio para el carácter de terminación ( '\0' ). Deberías crear el reverse esta manera:

 char* reverse = malloc(strlen(s) + 1); 

y no olvide asignar '\0' al último carácter de reverse . Además, no olvide que la persona que llama de esta función se hace responsable de desasignar la memoria asignada por malloc , es decir, la persona que llama debe llamar free en el puntero devuelto.