【问题标题】:Writing structures写作结构
【发布时间】:2021-08-18 06:16:22
【问题描述】:

我正在学习 C,目前正在学习结构。我正在查看以下代码:

struct client {
    char name[20];
    int key;
    int index;
};

struct client Client[100]; 

int function(void *ClientDetail) {
    struct client *clientDetail = (struct client*) ClientDetail; // what is this line doing?
}

您能解释一下注释行的重要性吗?

谢谢

【问题讨论】:

  • 重要性?每个角色都很重要,除了 cmets。
  • 你在哪里找到这个代码?
  • @AndreasWenzel 抱歉,我试图发布一个 sn-p 代码,但我犯了一个错误。修好了。
  • 请注意,如果ClientDetail void 指针指向的内存实际上不是struct client 结构,则代码会调用未定义的行为,因为它违反了strict aliasing rule。它还可以调用未定义的行为,因为它可能违反运行它的系统上的任何对齐限制。任何告诉你“但它有效”的人left out the "until it doesn't" part

标签: c pointers struct casting


【解决方案1】:

这一行

struct client *clientDetail = (struct client*) ClientDetail;

重新解释存储在指针 ClientDetail 中的地址,由于该声明,该地址具有 void * 类型

int function(void *ClientDetail) {

作为struct client 类型对象的地址。

现在使用指针clientDetail,您可以访问寻址内存,就好像有struct client 类型的对象一样。

请注意,使用这些标识符 ClientDetailclientDetail 是一个坏主意,它们仅在第一个字母的大小写上有所不同。

【讨论】:

  • 避免使用空指针也是一个好主意。
【解决方案2】:

函数function 接受void* 类型的参数并将其分配给局部变量。类型转换(struct client*) 是不必要的并且没有效果,因为数据类型void* 可以隐式转换为任何指针类型。请注意,这仅适用于编程语言 C,不适用于 C++。

在发布的代码中,函数参数和局部变量的名称非常相似。但是,由于 C 区分大小写,因此编译器会认为名称不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多