#include<stdio.h>
#include<string.h>
#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
出了什么问题?
答案 0 :(得分:3)
c:14: error: previous implicit declaration of 'rev' was here
您的错误是因为在rev()
中使用main()
之前,您没有为c28: warning: function returns address of local variable
生成原型。将您的功能移到main之上或添加原型。
malloc()
您的警告是因为您试图返回本地变量的地址,您不能这样做。离开函数时局部变量超出范围,因此您需要执行其他操作(例如通过添加free()
/ {{1}}调用来使用动态数组)
答案 1 :(得分:0)
char reverse[strlen(s)];
在堆栈中。功能完成后,它现在无效,但您将返回其地址。
答案 2 :(得分:0)
在调用函数中不再存在具有自动存储持续时间的变量。访问它会导致不确定的行为(任何事情都可能发生)。在这里,您将从reverse
返回rev
,这是一个本地变量。
而是动态分配内存:
int *reverse = malloc(strlen(s)); /* + 1 for '\0' character ? */
答案 3 :(得分:0)
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
}
答案 4 :(得分:0)
在此代码中:
char* rev(char s[]) {
char reverse[strlen(s)];
...
return reverse;
}
reverse
是一个具有自动存储持续时间的临时数组,一旦执行离开此函数的范围,该数据就会被释放。您返回一个指针,该指针成为悬空指针
尝试访问此指针指向的内存会产生未定义的行为。
除了你应该使用malloc
动态分配它之外,请注意strlen
返回字符串的长度,你还需要空格用于终止字符({{1} })。您应该像这样创建'\0'
:
reverse
并且不要忘记将char* reverse = malloc(strlen(s) + 1);
分配给'\0'
的最后一个字符。另外,请不要忘记此函数的调用者负责释放已由reverse
分配的内存,即调用者应在返回的指针上调用malloc
。