【问题标题】:Converting char* memory address to void* and back in C将 char* 内存地址转换为 void* 并返回 C
【发布时间】:2015-12-08 13:23:43
【问题描述】:

我正在尝试将 char* 的内存地址作为 void* 传递,然后将 void * 内存地址转换回其他地方的字符串。所以我有,

char *text               // text="somestring";
void *memadrs=&text;

现在我正在尝试从 void *memadrs 转换为新的 char *。

如果已经有与此相关的其他主题,我深表歉意,但由于我对指针/引用它们的搜索和混淆,我找不到任何相关的内容来满足这一点。

为帮助干杯!

编辑:对不起,让大家感到困惑,char* 不是一个常数。

【问题讨论】:

  • void * 指针可以毫无问题地转换为任何类型或从任何类型转换,这没有问题。但不太清楚你在问什么?
  • 关于 memadrs 变量,我正在从管道读取并写入该值。预先确定初始化为 *memadrs=&text;

标签: c string pointers memory


【解决方案1】:

鉴于const char* text = "somestring",您真的应该使用const void* memadrs = text 转换为const void*。这是因为 "somestring" 是一个 只读 以 null 结尾的字符串文字。请注意,您不需要使用地址运算符&,因为text 已经是指针类型。

如果随后尝试对char* 进行强制转换,则使用const void* 强制转换有助于产生编译时错误。这很有用,因为将memadrs 转换为char* 然后修改内存将是未定义,因为原始内存是只读的。 p>

支持这一点的 C 标准参考:

[C99: 6.7.3/5]:如果尝试修改使用定义的对象 通过使用左值的 const 限定类型 非 const 限定类型,行为未定义。

要转换回const char*,请使用(const char*)memadrs

我将char const* 切换为const char* 只是个人喜好。

【讨论】:

    【解决方案2】:

    你可以这样做:

    char const *text = "someString";
    void *memadrs = text;
    char const *newText = memadrs;
    

    它应该通过隐式转换来完成这项工作。

    通过显式转换,它看起来像:

    char const *text = "someString";
    void *memadrs = (void*)text;
    char const *newText = (char const *)memadrs;
    

    【讨论】:

      【解决方案3】:

      任何非函数指针都可以自动转换为void * 并返回而无需强制转换。

      在您的示例中,您尝试将char * 的地址(即char **)复制到void *,这可能不是您想要的。你可能想要这个:

      char  const *text="somestring";
      void *memadrs=text;
      

      【讨论】:

      • 如果您这样做,您可能会收到有关丢弃 const 限定符的编译器警告。为避免此类警告,您需要执行const void *memadrs=text;void *memadrs=(void *)text;,第二个选项更危险!
      【解决方案4】:

      你得到一个指向指针的指针。我怀疑您想要一个与text 具有相同值的指针。所以你可以这样做

      void *memadrs = text; // without &
      

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 2020-10-24
        • 2018-01-21
        • 2011-01-07
        • 2013-10-12
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多