C设计:传递内存地址或返回

C设计:传递内存地址或返回,c,C,在某些函数(如*scanf变体)中,有一个参数会占用内存空间作为结果。您还可以编写返回地址的代码。优点是什么,为什么要以如此奇怪的方式设计函数 范例 void process_settings(char* data) { .... // open file and put the contents in the data memory return; } vs 使用一种方法而不是另一种方法的决定取决于你打算做什么 范例 void process_settings(char* d

在某些函数(如*scanf变体)中,有一个参数会占用内存空间作为结果。您还可以编写返回地址的代码。优点是什么,为什么要以如此奇怪的方式设计函数

范例

void process_settings(char* data)
{
    .... // open file and put the contents in the data memory
    return;
}
vs


使用一种方法而不是另一种方法的决定取决于你打算做什么

范例

void process_settings(char* data)
{
    .... // open file and put the contents in the data memory
    return;
}
如果要修改函数中的数组并在原始数组中保持修改,应使用第一个示例

如果要创建自己的数据结构,则必须处理所有操作。如果你想创建一个新的结构,你应该在函数中分配内存并返回指针。第二个例子

如果希望从函数“返回”两个值,如向量和向量长度,并且不希望为此创建结构,则可以返回向量的指针,并将int指针作为函数的参数传递。这样,您就可以在函数内部修改int的值,并在函数外部使用它

char* return_vector_and_length(int* length);

使用一种方法而不是另一种方法的决定取决于你打算做什么

范例

void process_settings(char* data)
{
    .... // open file and put the contents in the data memory
    return;
}
如果要修改函数中的数组并在原始数组中保持修改,应使用第一个示例

如果要创建自己的数据结构,则必须处理所有操作。如果你想创建一个新的结构,你应该在函数中分配内存并返回指针。第二个例子

如果希望从函数“返回”两个值,如向量和向量长度,并且不希望为此创建结构,则可以返回向量的指针,并将int指针作为函数的参数传递。这样,您就可以在函数内部修改int的值,并在函数外部使用它

char* return_vector_and_length(int* length);

这样做的好处是,您可以为错误检查、状态指示器等保留函数的返回值,并使用输出参数实际发回数据。事实上,使用此模式,您可以随返回值一起发回任意数量的数据,这可能非常有用。当然,对于多个函数调用(例如,在循环中调用
scanf
以验证用户输入),您不必每次都调用
malloc

有效使用此模式的最佳示例之一是函数
strtol
,它将字符串转换为
长的

函数接受指向字符的指针作为其参数之一。通常将此
char
本地声明为
endptr
,并将其地址传递给函数。如果函数能够返回转换后的数字,但如果不能返回,它将返回
0
以指示失败,但也会将传入的字符指针设置为导致失败的非数字字符

然后,您可以报告该特定字符的转换失败

这是比使用全局错误指示器更好的设计;考虑多线程程序。如果要调用可能在多个线程中失败的函数,那么使用全局错误指示器可能是不合理的

您提到函数应该负责自己的内存。嗯,
scanf
不存在来创建存储扫描值的内存。它用于扫描输入缓冲区中的值。该职能部门的职责非常明确,不包括分配空间


返回
malloc
'd指针也是合理的。不过,程序员应该谨慎,在使用完返回的指针后,
释放它。

好处是,您可以保留函数的返回值用于错误检查、状态指示器等,并使用输出参数实际发回数据。事实上,使用此模式,您可以随返回值一起发回任意数量的数据,这可能非常有用。当然,对于多个函数调用(例如,在循环中调用
scanf
以验证用户输入),您不必每次都调用
malloc

有效使用此模式的最佳示例之一是函数
strtol
,它将字符串转换为
长的

函数接受指向字符的指针作为其参数之一。通常将此
char
本地声明为
endptr
,并将其地址传递给函数。如果函数能够返回转换后的数字,但如果不能返回,它将返回
0
以指示失败,但也会将传入的字符指针设置为导致失败的非数字字符

然后,您可以报告该特定字符的转换失败

这是比使用全局错误指示器更好的设计;考虑多线程程序。如果要调用可能在多个线程中失败的函数,那么使用全局错误指示器可能是不合理的

您提到函数应该负责自己的内存。嗯,
scanf
不存在来创建存储扫描值的内存。它用于扫描输入缓冲区中的值。该职能部门的职责非常明确,不包括分配空间


返回
malloc
'd指针也是合理的。不过,程序员应该谨慎,在使用完返回的指针后,
释放它。

比方说,您希望将进程设置存储在内存中的特定位置。对于第一个版本,您可以将其编写为,
process\u设置(output\u buffer+offset)。如果你只有第二个版本,你要怎么做?性能会发生什么变化