【问题标题】:How to cast void* struct members?如何强制转换 void* 结构成员?
【发布时间】:2019-08-25 18:39:25
【问题描述】:

我正在尝试从结构成员中转换 void*。结构如下所示:

typedef struct{
    int n;
    void* string;
}query;

我想将成员string 转换为char* 并存储另一个字符串——比如说str2——,像这样:

char* str2 = "hello";
(*(char*)q.string) = str2;

但它一直告诉我这个警告:

example.c:在函数“main”中: example.c:23:33: 警告:赋值从没有强制转换的指针生成整数 [-Wint-conversion] (* (char* )q.string) = str2;

为什么这不起作用?

【问题讨论】:

  • 我认为由于间接运算符应用于 q.string 指针而报告了警告。您尝试将 str2 指针值(地址)分配给 q.string 指向的内存区域的第一个字节。正确的方法是:q.string = str2;

标签: c string casting


【解决方案1】:

你根本不需要演员表。

也就是说,在您的示例中,query 是一种类型,而不是变量。

像这样使用它

query q;
q.string = str2;

A working example

【讨论】:

  • 是的!对不起,我写错了它确实是一种类型,我知道我真的不需要强制转换,但它是用于任务并且需要我需要强制转换 void*
  • @NikosC。为什么它“应该”是const?没有一个也可以。
  • @NikosC。没问题,cmets 没了。
  • @luciofondon 你检查我提供的例子了吗?这是你想要的吗?
  • 我不明白它不需要演员表,因为它适用于您发布的示例,但问题是任务要求我必须转换它,我想知道如果我正在正确地进行演员表,顺便说一句对不起我的英语不好!
【解决方案2】:

警告是正确的。较新版本的 gcc 有更有用的信息:

警告:从 'char *' 赋值给 'char' 会使 没有强制转换的指针的整数 [-Wint-conversion]

13 |     (*(char*)q.string) = str2;
   |                        ^

您取消引用 char *,它会为您提供 char。为 char 类型分配 str2 类型为 char *

正如Sourav Ghosh 向您展示的那样,您可以这样做:

q.string = str2;

如果你真的想让演员表明确:

q.string = (void*)str2;

如你所见,你在错误的一面做演员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2016-09-24
    • 2011-02-15
    • 1970-01-01
    • 2021-09-07
    • 2021-08-05
    • 2022-06-10
    相关资源
    最近更新 更多