在C语言中将char*类型的内存地址转换为void*类型,然后再转回去。

3

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

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

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

如果已经有关于这个主题的其他文章,我很抱歉,但是由于我的搜索和指针/引用它们方面的困惑,我找不到足够相关的内容来满足这个需求。

感谢您的帮助!

编辑:对于混淆造成的困惑,抱歉,char*并不是一个常量。


1
void *指针可以在任何类型之间进行转换,没有问题。但是你的问题不太清楚是什么? - ameyCU
关于memadrs变量,我正在从管道中读取并将该值写入。它预先确定为初始化为* memadrs =&text; - Clark
4个回答

3
给定const char* text = "somestring", 你应该使用const void* memadrs = text将其转换为const void*。这是因为"somestring"是一个只读的以null结尾的字符串字面量。请注意,由于text已经是指针类型,所以不需要使用取地址符&
使用const void*转换有助于在尝试后续转换为char*时发出编译时错误。如果对memadrs进行char*类型的转换,然后修改内存,行为将是不确定的,因为原始内存是只读的。以下是C语言标准的引用:

[C99: 6.7.3/5]: 如果通过使用具有非const限定类型的lvalue来修改以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;

1
任何非函数指针都可以自动转换为void *,并且不需要强制转换就可以进行相反的转换。
在您的示例中,您正在尝试将char *的地址(即char **)复制到void *,这可能不是您想要的。您可能想要这样做:
char  const *text="somestring";
void *memadrs=text;

如果你这样做,你可能会收到一个编译器警告,指出你正在丢弃const限定符。为了避免这样的警告,你需要使用const void *memadrs=text;或者void *memadrs=(void *)text;,后一种选项更加危险! - Ian Abbott

0

你得到了一个指向指针的指针。我猜想你想要一个与text相同值的指针。所以你可以这样做:

void *memadrs = text; // without &

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接