【问题标题】:array return type数组返回类型
【发布时间】:2013-03-05 15:53:57
【问题描述】:
#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

怎么了?

【问题讨论】:

  • 您正在返回一个局部变量的地址,这就是问题所在。 c-faq.com/~scs/cclass/int/sx5.html
  • 这是一个很好的编译器警告。请尊重它!
  • 是否要求您仅使用 LIFO 反转字符串?因为否则这是一个矫枉过正...
  • 1)。您使用原型 rev 和 2)。返回一个局部变量 3)。不是问题,但为什么要在 main.c 中转换 char * 的返回值。一切都是 char *.

标签: c


【解决方案1】:

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

您的错误是因为您在 main() 中使用它之前没有为 rev() 生成原型。要么将你的函数移到 main 之上,要么添加一个原型。

c28: warning: function returns address of local variable

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      而是动态分配内存:

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

      【讨论】:

        【解决方案4】:

        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
        
        }
        

        【讨论】:

          【解决方案5】:

          在这段代码中:

          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

          【讨论】:

            猜你喜欢
            • 2014-05-16
            • 2015-09-10
            • 2021-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-17
            • 2012-01-13
            • 2021-02-14
            相关资源
            最近更新 更多