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