为什么有些函数 return 结果既在 return 值中又通过写入指针传递?
Why some functions return the result both in return value and by writing to pointer passed?
最近正在阅读 getcwd(3) 的手册页。它将当前工作目录写入传递的 buf 指针,并将 returns 作为指向 char 的指针。
你能解释一下为什么这样做吗(使用两种方式给出结果)?
当需要 return 来自特定函数的多个结果时,我们使用指针。当只有一个值被 returned 时,不需要指针。
假设您编写了一个函数来获取当天的时间。时间有小时、分钟和秒。您的函数需要 return 3 个值,因此您传递某个位置(或结构)的地址,函数将填充该地址并 return 它给您。
同样适用于 srtcat 和 strcmp 等...
许多函数写入指定的参数缓冲区而不是分配它们自己的缓冲区。 (这允许调用者决定如何分配和管理缓冲区。)
然而,调用者直接使用结果通常很方便,例如在链接函数调用时,因此这些函数有时会额外 return 指向传入的同一缓冲区的指针。例如:
char buf[256] = "foo";
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1));
它的一个用途是在函数链接中。例如考虑像 strcat
这样的函数
char * strcat ( char * destination, const char * source );
这可以被调用为
strcat(dest, source);
但是,如果您想将 3 个字符串连接成 1 个,则可以使用函数链接
dest = strcat(strcat(dest, src1), src2);
我不确定这是对这个复杂问题的确切答案,但回到学院后,我的讲师告诉我们它的存在是为了避免意外的程序行为或意外的运行时错误。
我到底是什么意思?
例如,假设您必须使用 'strcpy'.
将一个字符串复制到另一个字符串
无需深入了解此函数的实现细节,作为一般情况,您应该保护您的数据免受空指针的侵害。
假设在函数调用期间发生了一些错误,并且由于 C 并不完全使用异常,它只是 returns Null 而不是。
如果直接忽略返回的空值会发生什么?
在这种情况下,它可能会导致运行时错误或一些意外行为。
看看这段代码:
char *str1 = ”Hello World”;
char *str2 = calloc(11, sizeof(char));
strcpy(str2, str1); // Error occurs, just part of the string is copied
if(!strcmp(str1,str2))
printf(”Success”); // Never gets printed - In a more complex example you could't even figure out why
您应该始终将此类函数的结果存储在临时指针中,以确保没有发生内部错误。
最近正在阅读 getcwd(3) 的手册页。它将当前工作目录写入传递的 buf 指针,并将 returns 作为指向 char 的指针。 你能解释一下为什么这样做吗(使用两种方式给出结果)?
当需要 return 来自特定函数的多个结果时,我们使用指针。当只有一个值被 returned 时,不需要指针。 假设您编写了一个函数来获取当天的时间。时间有小时、分钟和秒。您的函数需要 return 3 个值,因此您传递某个位置(或结构)的地址,函数将填充该地址并 return 它给您。
同样适用于 srtcat 和 strcmp 等...
许多函数写入指定的参数缓冲区而不是分配它们自己的缓冲区。 (这允许调用者决定如何分配和管理缓冲区。)
然而,调用者直接使用结果通常很方便,例如在链接函数调用时,因此这些函数有时会额外 return 指向传入的同一缓冲区的指针。例如:
char buf[256] = "foo";
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1));
它的一个用途是在函数链接中。例如考虑像 strcat
char * strcat ( char * destination, const char * source );
这可以被调用为
strcat(dest, source);
但是,如果您想将 3 个字符串连接成 1 个,则可以使用函数链接
dest = strcat(strcat(dest, src1), src2);
我不确定这是对这个复杂问题的确切答案,但回到学院后,我的讲师告诉我们它的存在是为了避免意外的程序行为或意外的运行时错误。
我到底是什么意思?
例如,假设您必须使用 'strcpy'.
将一个字符串复制到另一个字符串
无需深入了解此函数的实现细节,作为一般情况,您应该保护您的数据免受空指针的侵害。
假设在函数调用期间发生了一些错误,并且由于 C 并不完全使用异常,它只是 returns Null 而不是。
如果直接忽略返回的空值会发生什么?
在这种情况下,它可能会导致运行时错误或一些意外行为。
看看这段代码:
char *str1 = ”Hello World”;
char *str2 = calloc(11, sizeof(char));
strcpy(str2, str1); // Error occurs, just part of the string is copied
if(!strcmp(str1,str2))
printf(”Success”); // Never gets printed - In a more complex example you could't even figure out why
您应该始终将此类函数的结果存储在临时指针中,以确保没有发生内部错误。