数组返回类型

时间:2013-03-05 15:53:58

标签: c

#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

出了什么问题?

5 个答案:

答案 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