-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

怎么了?

4

5 回答 5

3

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

您的错误是因为您rev()main(). 要么将你的函数移到 main 之上,要么添加一个原型。

c28: warning: function returns address of local variable

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

于 2013-03-05T15:58:26.017 回答
0

在这段代码中:

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

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

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

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

并且不要忘记分配'\0'reverse. 也不要忘记该函数的调用者负责释放已分配的内存malloc,即调用者应该调用free返回的指针。

于 2013-03-05T16:02:16.660 回答
0

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

于 2013-03-05T15:57:13.610 回答
0

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

而是动态分配内存:

int *reverse = malloc(strlen(s)); /* + 1 for '\0' character ? */
于 2013-03-05T15:57:18.520 回答
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

}
于 2013-03-05T15:59:00.197 回答