为什么有些函数返回结果返回值和写入指针传递?

时间:2016-10-28 06:37:42

标签: c posix getcwd

最近正在阅读 getcwd(3)的手册页。它将当前工作目录写入传递的buf指针,并将其作为指向char的指针返回。 你能解释它为什么这样做(用两种方式给出结果)?

4 个答案:

答案 0 :(得分:3)

许多函数写入指定的参数缓冲区而不是分配它们自己的参数。 (这允许调用者决定如何分配和管理缓冲区。)

但是,调用者通常可以直接使用结果,例如链接函数调用时,这些函数有时会另外返回指向传入的相同缓冲区的指针。例如:

char buf[256] = "foo";
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1));

答案 1 :(得分:1)

其中一个用途是功能链。例如考虑像strcat

这样的函数
char * strcat ( char * destination, const char * source );

这可以作为

调用
strcat(dest, source);

但是,如果要将3个字符串连接成1,可以使用函数链

dest = strcat(strcat(dest, src1), src2);

答案 2 :(得分:1)

我不确定这是这个复杂问题的确切答案,但回到学院我的讲师告诉我们,它的存在是为了避免意外的程序行为或意外的运行时错误。

我究竟是什么意思?

例如,假设你必须使用'strcpy'将一个字符串复制到另一个字符串 在不深入了解此函数实现的详细信息的情况下,作为一般情况,您应该保护数据不受空指针的影响 假设在函数调用期间发生了一些错误,并且因为C不完全使用异常,所以它只返回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

您应该始终将此类函数的结果存储在临时指针中,以确保您没有发生内部错误。

答案 3 :(得分:0)

当需要从特定函数返回多个结果时,我们使用指针。当只返回一个值时,不需要指针。 假设您编写了一个函数来获取当天的时间。时间有小时,分钟和秒。你的函数需要返回3个值,因此你传递了某个位置(或结构)的地址,函数将填充地址并将其返回给你。

同样适用于srtcat和strcmp等......