为什么我的 ANSI C 函数不保留它设置的参数值?

Why doesn't my ANSI C function preserve the parameter value it sets?

我在 Linux 上使用带有 gcc 的 ANSI C 进行一个项目,并且正在尝试为自己编写一些实用函数以使事情变得更容易。特别是,我正在尝试编写一个 "safe" 字符串连接函数,它使用固定的内存大小并确保我永远不会超过该大小。这是我第一次写这个函数:

#define STRING_SIZE 1024
#define MIN(a, b) (a < b ? a : b)

void concatenate1(char *dest, const char *src)
{
    if (dest == NULL) {
        dest = malloc(STRING_SIZE);
        strncpy(dest, src, MIN(strlen(src), STRING_SIZE));
    } else {
        strncat(dest, src, STRING_SIZE - strlen(dest));
    }
}

我的想法是我可以声明我的字符串(字符指针),然后开始重复添加它,不需要区分是用第一个值初始化字符串还是连接到现有值,因为函数会帮我处理的。换句话说,这里有一些代码展示了这一点:

int main(void)
{
    char *myString;
    concatenate1(myString, "The ");
    concatenate1(myString, "quick ");
    concatenate1(myString, "brown ");
    concatenate1(myString, "fox");
    printf("%s\n", myString);
    return 0;
}

问题是这会导致分段错误。所以我改写了这个版本:

void concatenate2(char **dest, const char *src)
{
    if (**dest == 0) {
        *dest = malloc(STRING_SIZE);
        strncpy(*dest, src, MIN(strlen(src), STRING_SIZE));
    } else {
        strncat(*dest, src, STRING_SIZE - strlen(*dest));
    }
}

我用这段代码调用它:

int main(void)
{
    char *myString;
    concatenate2(&myString, "The ");
    concatenate2(&myString, "quick ");
    concatenate2(&myString, "brown ");
    concatenate2(&myString, "fox");
    printf("%s\n", myString);
    return 0;
}

那个版本没问题。但我承认我觉得有点烦人,因为我现在必须在我的变量前加上 & 才能使函数正常工作。我的第一个版本出了什么问题?有什么方法可以将 char 指针传递给函数并直接修改它,或者这是更新 C 中现有字符串的唯一合法方法吗?

您的第一个示例不起作用,因为在您的函数中设置 dest = malloc(STRING_SIZE); 只会在本地设置该值。它不会传播回调用者。

您在第二个示例中所做的是完成这项工作的唯一方法。在 C 中无法完成您要求的操作。但是,C++ 具有类似的功能:引用参数。