C 如何从函数返回整数
哪一种被认为是更好的风格C 如何从函数返回整数,c,C,哪一种被认为是更好的风格 int set_int (int *source) { *source = 5; return 0; } int main(){ int x; set_int (&x); } 或 我要说的是,我更喜欢第二个版本。任何提示都会非常有用。仍在学习C.两者都不是 // "best" style for a function which sets an integer taken by pointer void set_int(int *p)
int set_int (int *source) {
*source = 5;
return 0;
}
int main(){
int x;
set_int (&x);
}
或
我要说的是,我更喜欢第二个版本。任何提示都会非常有用。仍在学习C.两者都不是
// "best" style for a function which sets an integer taken by pointer
void set_int(int *p) { *p = 5; }
int i;
set_int(&i);
或:
仅仅因为高级编程语言在幕后进行了大量分配,并不意味着如果您继续添加更多不必要的分配,您的C代码将变得更易于编写/读取/调试:-)
如果您确实需要使用malloc分配一个int,并使用指向该int的指针,那么我将使用第一个(但已修复错误):
请注意,函数set_int在两种方式中都是相同的。它不在乎它的设置来自哪里,不管它是在堆栈上还是堆上,谁拥有它,它是否已经存在很长时间,或者它是否是全新的。所以它是灵活的。如果你还想写一个函数,它做两件事(分配一些东西并设置值),那么你当然可以,使用set\u int
作为构建块,也许像这样:
int *allocate_and_set_int() {
int *x = malloc(sizeof(*x));
if (x != 0) set_int(x);
return x;
}
在实际应用程序的上下文中,您可能会想到一个比分配和设置更好的名称
// "best" style for a function which sets an integer taken by pointer
void set_int(int *p) { *p = 5; }
int i;
set_int(&i);
或:
仅仅因为高级编程语言在幕后进行了大量分配,并不意味着如果您继续添加更多不必要的分配,您的C代码将变得更易于编写/读取/调试:-)
如果您确实需要使用malloc分配一个int,并使用指向该int的指针,那么我将使用第一个(但已修复错误):
请注意,函数set_int在两种方式中都是相同的。它不在乎它的设置来自哪里,不管它是在堆栈上还是堆上,谁拥有它,它是否已经存在很长时间,或者它是否是全新的。所以它是灵活的。如果你还想写一个函数,它做两件事(分配一些东西并设置值),那么你当然可以,使用set\u int
作为构建块,也许像这样:
int *allocate_and_set_int() {
int *x = malloc(sizeof(*x));
if (x != 0) set_int(x);
return x;
}
在实际应用程序的上下文中,您可能会想到一个比
allocate\u和\u set\u int
…更好的名称。在第二个应用程序中,您需要一个指向指针的指针才能工作,而在第一个应用程序中,您没有使用返回值,尽管您应该这样做
我倾向于选择C语言中的第一个,但这取决于您实际在做什么,因为我怀疑您是否在做这么简单的事情
尽可能地简化代码,KISS原则仍然有效。在第二种方法中,您需要一个指向指针的指针才能使其工作,而在第一种方法中,您没有使用返回值,尽管您应该这样做 我倾向于选择C语言中的第一个,但这取决于您实际在做什么,因为我怀疑您是否在做这么简单的事情 尽可能简单地编写代码,KISS原则仍然有效。一些错误: 此外,在第一个代码示例中,您没有分配任何内存
int *x = malloc(sizeof(int));
关于样式:我更喜欢第一个,因为不释放指针所持有的内存的可能性较小。一些错误: 此外,在第一个代码示例中,您没有分配任何内存
int *x = malloc(sizeof(int));
关于样式:我更喜欢第一个版本,因为不释放指针所持有的内存的可能性较小。肯定会使用第一个版本。请注意,这允许您省略动态内存分配,这很慢,如果您以后忘记释放该内存,可能会导致错误 另外,如果出于某种原因决定使用第二种样式,请注意,不需要将指针初始化为NULL。该值将被
malloc()
返回的任何内容覆盖。如果内存不足,malloc()。
所以int*temp=malloc(sizeof(int))代码>就足够了。一定要使用第一个版本。请注意,这允许您省略动态内存分配,这很慢,如果您以后忘记释放该内存,可能会导致错误
另外,如果出于某种原因决定使用第二种样式,请注意,不需要将指针初始化为NULL。该值将被malloc()
返回的任何内容覆盖。如果内存不足,malloc()。
所以int*temp=malloc(sizeof(int))代码>就足够了。内存管理规则通常说明内存块的分配器也应该解除分配它。当您返回分配的内存时,这是不可能的。因此,第二个应该更好
对于更复杂的类型(如结构),您通常会得到一个初始化它的函数,也可能是一个处理它的函数。分配和解除分配应由您单独完成
C给了您动态或静态分配内存的自由,而让一个函数只在两种模式中的一种模式下工作(如果您有一个函数返回动态分配的内存,则会出现这种情况)会限制您
typedef struct
{
int x;
float y;
} foo;
void foo_init(foo* object, int x, float y)
{
object->x = x;
object->y = y;
}
int main()
{
foo myFoo;
foo_init(&foo, 1, 3.1416);
}
内存管理规则通常声明内存块的分配器也应该释放它。当您返回分配的内存时,这是不可能的。因此,第二个应该更好
对于更复杂的类型(如结构),您通常会得到一个初始化它的函数,也可能是一个处理它的函数。分配和解除分配应由您单独完成
C给了您动态或静态分配内存的自由,而让一个函数只在两种模式中的一种模式下工作(如果您有一个函数返回动态分配的内存,则会出现这种情况)会限制您
typedef struct
{
int x;
float y;
} foo;
void foo_init(foo* object, int x, float y)
{
object->x = x;
object->y = y;
}
int main()
{
foo myFoo;
foo_init(&foo, 1, 3.1416);
}
第一个是不正确的(除了语法错误)-您正在向set\u int()
传递一个未初始化的指针。正确的做法是:
int main()
{
int x;
set_int(&x);
}
int get_int(void)
{
return 5;
}
int main()
{
int x;
x = get_int();
}
struct somestruct *new_somestruct(int p1, const char *p2)
{
struct somestruct *s = malloc(sizeof *s);
if (s)
{
s->x = 0;
s->j = p1;
s->abc = p2;
}
return s;
}
int main()
{
struct somestruct *foo = new_somestruct(10, "Phil Collins");
free(foo);
return 0;
}