返回字符串文字?

Returning a string literal?

我有一个动态分配的指针数组,每个指针都指向文件中的一行文本。我需要提取文件的第四列(文件中的值用逗号分隔),以便稍后可以按该列对文件进行排序。我已经能够提取第四列文本,但是我无法 return 它用于我的主要功能,当我 return 它时,它是空白的,可能是什么问题?

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 获取开始和结束之间的所有字符,并将它们放入一个数组中(这是我 return 到 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 打印一个空白值。这是为什么?

你让 final 指向 local 数组 subject,然后 return 那个指针。这意味着您实际上 return 指向本地 subject 数组的指针,该数组一旦函数 returns 就超出范围,给您留下一个杂散指针和 undefined behavior.


最后的字符串需要分配内存,一般有两种方式:

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

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

您正在 return 指向堆栈变量的指针,您不能那样做。一旦你return,堆栈就会被清除。复制

 return strdup(final);

调用完成后必须释放它