在c中返回指向字符串文字的指针

Returning pointers to string literals in c

这是一个简单的程序,我想在其中接收一个字符串文字和 return 一个指向字符串文字的指针。我知道字符串文字是常量,因此无法完成。那么这样做的正确方法是什么。 该程序打印传入的相同字符串。

char* sort(char* str){
    int len = strlen(str);
    for (int i = 0; i < len -1; ++i)
    {
        for (int j = i + 1; j < len; ++j)
        {
            if (str[j]<str[i])
            {
                swap(str[j], str[i]);

            }
        }
    }
    printf("%s\n", str);
    return str;
}//end of sort

此外,如果您建议使用 malloc,我应该在哪里释放堆。

您可以传入一个指向存储结果的数组的指针。这样,您所有的内存管理都可以在函数之外处理。

void sort(const char* const strLit, size_t strLitSize, char *strSorted, size_t strSortedSize) {
    memcpy(strSorted, strLit, strLitSize);
    int len = strlen(strLit);
    for (int i = 0; i < len -1; ++i)
    {
        for (int j = i + 1; j < len; ++j)
        {
            if (strSorted[j]<strSorted[i])
            {
                swap(strSorted[j], strSorted[i]);

            }
        }
    }
    printf("%s\n", str);
}//end of sort

你可以这样称呼它:

#define str "some string here";
size_t sizeSorted = strlen(str) * sizeof(char);
char *pSorted = malloc( sizeSorted );

sort(str, sizeof(str), pSorted, sizeSorted);

printf("%s\n", pSorted);
free(pSorted);

更好的是,只需在外部复制一份并按原样使用您的函数。

您需要决定此函数是就地修改提供的字符串,还是分配一个新字符串。您不能就地修改字符串文字,因为正如您所指出的,它是常量。

选项 1:就地修改

这几乎就是您所拥有的,但是如果调用者想要使用字符串文字,他们将需要执行如下操作:

char *s = strdup("hello");
sort(s);
// use s here
free(s);

选项 2:分配一个新字符串

或者,您可以在排序函数中进行分配:

char* sort(char *input){
    int len = strlen(input);
    char *str = strdup(input);
    for (int i = 0; i < len -1; ++i)
    /// etc.

调用者将负责在完成结果后调用 free

char *s = sort("hello");
// use s here
free(s);

无论哪种方式,调用者都负责释放新分配的字符串。