数组返回类型
#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
。