Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从函数返回整数_C - Fatal编程技术网

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;
}