2013-03-05 91 views
-4
#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 

什么错?

+1

你正在返回一个局部变量的地址,这就是错误。 http://c-faq.com/~scs/cclass/int/sx5.html – netcoder 2013-03-05 15:57:14

+2

这是一个很好的编译器警告。请尊重它! – 2013-03-05 15:58:23

+0

你被要求只使用LIFO来反转一个字符串吗?因为否则这是一个矫枉过正的... – UmNyobe 2013-03-05 15:58:53

回答

0

char reverse[strlen(s)];在堆栈上。功能完成后,它现在是无效的,但你要返回它的地址。

0

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

而是动态地分配内存:

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

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

你的错误是因为你没有生成原型rev()您在使用main()之前。或者将你的函数移动到main的上面或者添加一个原型。

c28: warning: function returns address of local variable

你的警告,是因为你试图返回一个局部变量的地址,你不能这样做。当你离开函数时局部变量超出范围,所以你需要做其他的事情(比如通过添加malloc()/free()调用来使用动态数组)

0

reverse是一个本地数组。当函数退出时它被销毁,但是你返回一个指向其内容的指针。

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

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 

} 
0

在此代码返回数组具有自动存储持续时间的临时数组,一旦执行离开该函数的作用域,该数组将被释放。你返回一个指针变成悬挂指针
尝试访问此指针指向的内存产生未定义的行为

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

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

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