返回一个字符串文字?

时间:2015-04-06 17:17:46

标签: c string function return literals

我有一个动态分配的指针数组,每个指针指向一个文件中的一行文本。我需要提取文件的第四列(文件中的值用逗号分隔),这样我以后就可以按该列对文件进行排序。我已经能够提取第四列文本,但是我无法将其返回到我的main函数中使用,当我返回它时,它是空白的,可能是什么问题?

getStart在所需列

之前找到逗号
int getStart(char** addresses, int index)
{
    int i = 0;
    int count = 0;

    for(i=0;i < strlen(addresses[index]); i++)
    {
            if(addresses[index][i] == ',')
                    count += 1;
            if(count == 3)
                    return i+1;
    }
}

getStop在所需列的结尾之前找到逗号

int getStop(char** addresses, int index)
{
    int i = 0;
    int count = 0;

    for(i=0;i < strlen(addresses[index]); i++)
    {
            if(addresses[index][i] == ',')
                    count += 1;
            if(count == 4)
                    return i;
    }
}

getSubject获取start和stop之间的所有字符,并将它们放入一个数组中(这是我需要返回main的数据)

char* getSubject(char** addresses, int index)
{

    int i = 0;
    int start;
    int stop;
    char* final;
    char subject[10];

    start = getStart(addresses, index);
    stop = getStop(addresses, index);

    for(start; start<stop; start++)
    {
            subject[i] = addresses[index][start];
            i++;
    }
    final = subject;
    printf("%s %s\n", final, subject);
    return final;

}

我知道函数的工作方式是

    printf("%s %s\n", final, subject);

打印正确的值,但是当我在main中调用它时,如下所示:

    char* test;
    test = getSubject(addresses, 43);
    printf("%s\n", test);

test打印一个空白值。这是为什么?

2 个答案:

答案 0 :(得分:2)

您使final指向本地数组subject,然后返回该指针。这意味着你实际上正在返回一个指向本地subject数组的指针,一个数组在函数返回后超出范围,留下一个迷路指针和undefined behavior


您需要为最终字符串分配内存,通常有两种方法:

  1. 使用例如strdup在函数中分配内存并返回指向新内存的指针。

  2. 将指向内存足够的缓冲区的指针作为函数的参数传入,并将字符串复制到该缓冲区。

答案 1 :(得分:1)

你正在返回一个指向堆栈变量的指针,你不能这样做。返回后,堆栈将被清除。制作副本

 return strdup(final);

调用必须在完成后释放它