数组返回类型

#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]; } 

这些是错误消息..

 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 

出了什么问题?

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

您的错误是因为在main()使用它之前没有为rev()生成原型。 将您的function移到main之上或添加原型。

c28: warning: function returns address of local variable

您的警告是因为您试图返回本地变量的地址,您不能这样做。 离开函数时局部变量超出范围,因此您需要执行其他操作(例如通过添加malloc() / free()调用来使用动态数组)

char reverse[strlen(s)]; 在堆栈上。 function完成后,它现在无效,但您将返回其地址。

在调用函数中不再存在具有自动存储持续时间的变量。 访问它会导致未定义的行为(任何事情都可能发生)。 在这里,您将从rev返回,这是一个局部变量。

而是动态分配内存:

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

reverse是一个本地数组。 当函数退出时,它会被销毁,但是返回指向其内容的指针。 理想情况下,您应该通过使用函数将数据加载到的参数来返回数组,即

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

代替

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

在这段代码中:

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

reverse是一个具有自动存储持续时间的临时数组,一旦执行离开此函数的范围,该数据就会被释放。 你返回一个指针,成为一个悬空指针
尝试访问此指针指向的内存会产生未定义的行为

除了你应该使用malloc动态分配它,请注意strlen返回字符串的长度,你还需要空格用于终止字符( '\0' )。 您应该像这样创建reverse

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

并且不要忘记将'\0'分配给reverse的最后一个字符。 另外不要忘记,此函数的调用者负责释放已经由malloc分配的malloc ,即调用者应该在返回的指针上调用free