1

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

4

4 回答 4

3

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

但是,调用者直接使用结果通常很方便,例如在链接函数调用时,因此这些函数有时会额外返回指向传入的同一缓冲区的指针。例如:

char buf[256] = "foo";
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1));
于 2016-10-28T07:31:15.563 回答
1

它的一种用途是在函数链中。例如考虑一个函数strcat

char * strcat ( char * destination, const char * source );

这可以调用为

strcat(dest, source);

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

dest = strcat(strcat(dest, src1), src2);
于 2016-10-28T07:32:22.803 回答
1

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

我到底是什么意思?

例如,假设您必须使用“strcpy”将一个字符串复制到另一个字符串。
在不深入了解该函数实现的更深细节的情况下,作为一般情况,您应该保护您的数据免受空指针的影响。
假设在函数调用期间发生了一些错误,并且由于 C 并没有完全使用异常,它只是返回 Null。
如果你忽略返回的 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

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

于 2016-10-28T07:52:23.793 回答
0

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

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

于 2016-10-28T07:21:38.350 回答