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

时间:2017-03-02 22:54:55

标签: c string pointers concatenation ansi-c

我在Linux上使用ANSI C和gcc进行项目,并且我正在尝试为自己编写一些实用程序函数以使头发变得更容易。特别是,我试图写一个" 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));
    }
}

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

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中现有字符串的唯一合法方法吗?

1 个答案:

答案 0 :(得分:1)

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

你在第二个例子中所做的是使这项工作成功的唯一方法。没有办法做你在C中要求的东西。但是,C ++有一个类似的特征:参考参数。