为什么我的 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++ 具有类似的功能:引用参数。
我在 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++ 具有类似的功能:引用参数。