从函数返回字符串指针:错误

时间:2011-02-16 11:41:48

标签: c linux gcc string

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
char** parser(char *message)
{
    char a[9][256];
    char* tmp =message;
    bool inQuote=0;
    int counter=0;
    int counter2=0;
    while(*tmp!='\0')
    {
        switch(*tmp)
        {
            case ',': if(!inQuote)
                   {    
                    a[counter][counter2]='\0';
                    printf("A[%d]: %s\n",counter,a[counter]);
                    counter++;
                    counter2=0;
                    }

                  break;
            case '"':
                inQuote=!inQuote;
                break;
            default:
                a[counter][counter2]=*tmp;
                counter2++;
                break;
        }
    tmp++;

    }
        a[counter][counter2]='\0';
        printf("A[%d]: %s\n",counter,a[counter]);
        return(a);

}
int main()
{
    char **a = parser("N,8545,01/02/2011 09:15:01.815,\"RASTA OPTSTK 24FEB2011 1,150.00 CE\",S,8.80,250,0.00,0");
    return 0;
}

给出的错误是Line 38 : return from incompatible pointer typefunction returns address of local variable

编辑有人可以相应地修改代码,以便我可以从(通过指针)访问main()中的'a'内容;

4 个答案:

答案 0 :(得分:2)

错误不言而喻

  

第38行:从不兼容的地方返回   指针类型

a已被定义为char a[9][256]。因此,在语句return(a);中,返回的值的类型是char (*)[256](指向256个字符数组的指针)而不是char **(根据解析器的原型())< / p>

  

函数返回本地地址   变量

嗯,a是函数的局部变量。您不应该返回局部变量的地址(除非它的内存已动态分配或是静态变量)

答案 1 :(得分:1)

不建议在函数外部返回局部变量的地址,因为它们存储在堆栈中,并且不应该在函数外部访问。可以通过适当的类型转换删除不兼容类型警告 - 但同样,您不应该返回局部变量的地址。

答案 2 :(得分:1)

在你的代码中你返回指针但是在函数定义中你已经声明它返回指向指针的指针,这就是你遇到错误的原因。也因为局部变量是在堆栈中创建的,一旦控件返回到调用函数堆栈被清除,因此您引用的是一个不包含数据的位置。因此,最好将2D字符数组声明为静态。

答案 3 :(得分:1)

char **解析器(char 消息) {     char a [9] [256];     char tmp = message;     bool inQuote = 0;

必须

char **解析器(char 消息) {     静态 char a [9] [256];     char tmp = message;     bool inQuote = 0;