我试图将char *的内存地址作为void *传递,然后将void *内存地址转换回其他地方的字符串。我有,
char *text // text="somestring";
void *memadrs=&text;
现在我试图将void * memadrs转换为新的char *。
我很抱歉,如果还有其他相关话题,但由于我的搜索和关于指针的混淆/引用它们,我找不到任何相关的东西来满足这一点。
欢呼帮助!
编辑:对不起混淆的人来说,char *不是常数。
答案 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 &