【问题标题】:structure tips that confusing令人困惑的结构提示
【发布时间】:2015-02-09 03:05:10
【问题描述】:

我正在学习 c 中的结构,但有一些技巧让我感到困惑 所以如果我们有这样的结构

struct Person{
char* name;
int age;
int weight;
int height;
};

现在它是一种复合数据类型,我可以像处理其他数据类型一样处理它。 当我指向这个结构时

struct Person pointer=malloc(sizeof(Person)); 

如果我的问题是结构体,现在 c 指向内存中的地址

A) 真的 c 知道 Person 由 4 个变量组成,名称为 name、age、weight、height,并将该实体复制到指针指向的新位置?

B)这两种语法有什么区别?

struct Person *pointer=(Person*)malloc(sizeof(Person));
struct Person *pointer=malloc(sizeof(Person));

C)我不熟悉这个函数减速语法,所以任何人都可以向我解释一下(函数名是一个指针)?

struct Person *Person_create(char* name, int age, int height, int   weight){...}

【问题讨论】:

    标签: c struct


    【解决方案1】:

    问题 A:

    真的知道 Person 由 4 个变量组成,名称分别为 name、age、weight、height 并将该实体复制到指针指向的新位置?

    答案:

    问题第一部分的答案是“是”,但我会改写它,因为C 编译器知道...

    我不清楚问题的第二部分。我不确定你在问什么。

    问题 B:

    这两种语法有什么区别?

    struct Person *pointer=(Person*)malloc(sizeof(Person));
    struct Person *pointer=malloc(sizeof(Person));
    

    答案:

    如果你使用

     #include <stdlib.h>
    

    在 .c 文件的顶部,两者是相同的。如果你没有那条线,那么

     struct Person *pointer=(Person*)malloc(sizeof(Person));
    

    有可能隐藏错误。详情请见Do I cast the result of malloc?

    问题 C:

    我不熟悉这个函数减速语法,所以任何人都可以向我解释一下(函数名是一个指针)?

    struct Person *Person_create(char* name, int age, int height, int   weight){...}
    

    答案:

    如果您想使用malloc 系列函数从堆中分配struct Person 类型的对象并返回指向已分配对象的指针,则上述语法是正确的。

    您还可以选择返回使用堆栈内存定义的对象。

     struct Person Person_create(char* name, int age, int height, int   weight){...}
    

    你选择哪一个完全取决于你。你必须确保当你为对象使用堆内存时,你必须记得在指针上调用free()。否则,您的程序会泄漏内存。

    【讨论】:

    • 我的问题A的第二部分是pointer->age=30;在将 malloc 进程分配到所需内存之后,c 编译器如何在新分配的空间中存储名为 age 的变量,其值为 20,尽管 age 是 struct person 的变量?
    • malloc 只返回一组字节。它不对这些字节设置任何值。您必须用必要的数据填充它。另一方面,calloc 返回一组初始化为 0 的字节。
    【解决方案2】:

    A) 不,malloc() 返回一个字节数组,它们对它们应该包含的内容一无所知。特别是,pointer 指向未初始化的 Person,它可能包含任何内容,直到您初始化字段(或 memset(pointer, 0, sizeof(Person)))。

    B) 不同之处在于,带有演员表 ((Person*)) 的那个在 C 中被认为是不好的做法。使用较短的那个,因为它更短并且不会隐藏潜在的错误。

    C) struct Person *Person_create 不是“函数的名称是一个指针”,而是“一个返回指针的函数”。有些人会把它写成struct Person* Person_create

    【讨论】:

    • 我很好地回答了我的 B 问题,但对于 A 和 C A) 现在 malloc 只返回未初始化的字节数组 ..ok 当我创建指针->age=20;尽管在新分配的块中没有称为年龄的块,但 c 在这种情况下如何操作,对于 C 问题,我们使用这个指针来使用函数,那么函数名称和函数在哪里,你提供给我更多关于这个语法的信息?
    • C 中的大多数东西只是字节块,在运行时不需要类型信息。因此,在 C 中使用字节块作为整数是正常的,在将数字存储在其中之前,您无需将块“转换”为整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多