char的C风格转换后的不同内存分配[关闭]

Posted

技术标签:

【中文标题】char的C风格转换后的不同内存分配[关闭]【英文标题】:Different memory allocation after C-style casting for char [closed] 【发布时间】:2021-12-07 11:25:33 【问题描述】:

问题是,当我将&char 转换为void*,然后再次转换为char* 时,结果指针具有不同的地址分配。

char example = '-';
void* voidPtr = (void*)&example;
char* charPtr = (char*)voidPtr;

cout << (void*)&example << endl; // 004FFC37
cout << voidPtr << endl;         // 004FFC37
cout << (void*)&charPtr << endl; // **004FFC30**

但对于 short(int、float、double 也是如此)而言,情况并非如此。

short example   = 1;
void* voidPtr   = (void*)&example;
short* shortPtr = (short*)voidPtr;
    
cout << &example << endl; // 0032FC14
cout << voidPtr  << endl; // 0032FC14
cout << shortPtr << endl; // 0032FC14

为什么会这样?

【问题讨论】:

因为&amp;charPtrcharPtr 的位置,而不是它的值。 我认为您添加了(void*) 演员表以便字符指针将打印出地址而不是字符串?这很好,因为您不处理以空字符结尾的字符串。但是,它会在有问题的案例和工作案例之间产生相当明显的差异。为了更好地比较,您还应该在工作案例中引入演员表,如cout &lt;&lt; (void*)&amp;shortPtr &lt;&lt; endl; 并在您的问题中提及使用演员表的原因。这应该会导致工作案例失败(如果您保留&amp;)或者更容易发现流浪&amp; 【参考方案1】:

其实是一样的。就这样

cout << (void*)&charPtr << endl; 

应该是

cout << (void*)charPtr << endl; 

错误地,您打印的是charPtr 本身的地址,而不是charPtr 指向的地址。

【讨论】:

以上是关于char的C风格转换后的不同内存分配[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

初始化 char* 并为特定数量分配内存会添加 nullptr 字符 [关闭]

将已知长度的 char 指针转换为 char 向量而不分配新内存

c语言数组在内存中是怎么分配的?

如何在C中为char**动态分配内存

如何在c中为指向char的指针数组分配内存

C提高 6 指针杂项 API函数封装,sockets封装 ,内存泄漏检测,日志库