我有这个add_str函数的代码:
void add_str(char *str1, char *str2, char **res)
{
int i;
int j = 0;
res[0] = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
if (res[0] == NULL)
return;
for (i = 0; str1[i]; i++)
res[0][j++] = str1[i];
for (i = 0; str2[i]; i++)
res[0][j++] = str2[i];
res[0][j] = '\0';
}
它接收2个字符串str1
和str2
以及一个不是malloc的字符串**res
。我的功能在** res。
str1
和str2
我的问题是:每次我必须用它做某事时,有没有办法不写res[0]
?
答案 0 :(得分:6)
res
是指向指针的指针,因此在使用它之前需要取消引用它。你是对的res[0]
不是在这种情况下做到这一点的正确方法。请改用(*res)
。
答案 1 :(得分:3)
你真正想要的是取消引用:
*res
答案 2 :(得分:2)
为什么还需要传递指针指针?您也可以将其更改为:
char *add_str(char *str1, char *str2)
{
char *res = malloc((strlen(str1) + strlen(str2) + 1));
if (res == NULL)
return NULL;
char *ret = res;
while(*str1 != 0)
*res++ = *str1++;
while(*str2 != 0)
*res++ = *str2++;
*res = '\0';
return ret;
}
它具有相同的效果,你不必处理这个丑陋的构造。
答案 3 :(得分:1)
这不是您问题的直接答案,而是更多的一般编码建议:
为了正确管理程序中的所有动态内存操作,您应该努力(尽可能多地尝试)从同一个函数执行操作x=malloc(...)
和free(x)
。
在大多数情况下,如果您正确设计代码,那么您可以实现此目的。
在某些情况下,当流程是异步的时,就不可能这样做。例如,一个函数分配缓冲区,在系统中发生某些事件后,另一个函数(AKA回调)释放缓冲区。
在这种情况下,您仍应尝试将两个操作都放在同一“范围”(类,文件或模块)中。
在您的编码示例中,函数add_str
分配缓冲区但不释放缓冲区,这意味着其他一些函数最终必须执行它(或者您将有内存泄漏)。因此,如果可能,那么您应该尝试在此函数之外执行malloc
。
答案 4 :(得分:0)
我会使用另一个指针变量来保存结果字符串,这样可以避免始终取消引用结果变量。当然,除此之外,您应该避免使用数组下标运算符,其中使用简单的指针解引用。我还对您的示例代码进行了一些其他更改,以使其更简洁,随意忽略它们。
void add_str(char *str1, char *str2, char **res) {
char* result = *res = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
//Dereferencing a NULL pointer will safely crash your program on any sane system.
//if (!result) return;
int j = 0; //Since C99 you are allowed to mix code and variable declarations.
for(int i = 0; str1[i]; i++) result[j++] = str1[i];
for(int i = 0; str2[i]; i++) result[j++] = str2[i];
result[j] = '\0';
}
如果指针充分发挥作用,您的代码可能如下所示:
void add_str(char *str1, char *str2, char **res) {
char* result = *res = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
while(*str1) *result++ = *str1++;
while(*str2) *result++ = *str2++;
*result = '\0';
}