将char *内存地址转换为void *并返回C

时间:2015-12-08 13:23:44

标签: c string pointers memory

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

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

现在我试图将void * memadrs转换为新的char *。

我很抱歉,如果还有其他相关话题,但由于我的搜索和关于指针的混淆/引用它们,我找不到任何相关的东西来满足这一点。

欢呼帮助!

编辑:对不起混淆的人来说,char *不是常数。

4 个答案:

答案 0 :(得分:2)

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

如果尝试后续转换为const void*,使用char*强制转换有助于发生编译时错误。这很有用,因为将memadrs转换为char*然后修改内存时的行为行为将未定义,因为原始内存已被读取 - 仅

支持C的标准参考:

  

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

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

我将char const*切换为const char*只是个人品味。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

你可以这样做:

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 :(得分:0)

您正在获取指向指针的指针。我怀疑你想要一个具有text相同值的指针。所以你可以做到

void *memadrs = text; // without &