【问题标题】:Pointer typecasting c++指针类型转换 C++
【发布时间】:2020-08-02 14:56:46
【问题描述】:
#include <iostream>

#define print(x) std::cout << x;
#define println(x) std::cout << x << std::endl;

int main() {
    int ex[5];
    int* ptr = ex;
    for (int i = 0; i < 5; i++) {
        ex[i] = 2;
    }
    ex[2] = 3;
    *(int*)((char*)ptr + 8) = 4;
    println(ex[2]);
}

在第 13 行,我正在使用 (char*),当我运行 println(sizeof(char*)) 时,它说它是 4 个字节,但我的导师说它是 1 个字节长,所以我们需要添加 8 个字节来访问 ex[ 2],这怎么可能我不明白! :/

【问题讨论】:

  • 你的问题在哪里?
  • sizeof(char) 为 1,sizeof(char*) 取决于平台(在大多数系统上为 4 或 8)
  • println(sizeof(char*)) 是基于架构的 4 或 8 个字节。可能你的教授已经提到它char
  • 只有在sizeof(int)4 时,第13 行才会可靠地修改ex[2] 并赋予它4 的值。这是不能保证的。尽管sizeof(char)1(根据定义)其他类型的大小(例如sizeof(char *)sizeof(int) 都是实现定义的)。

标签: c++ arrays char sizeof


【解决方案1】:

这取决于您使用的架构。根据定义 char 是大小为 1 的类型,因此 sizeof(char) 的计算结果为 1,但并不自动意味着它是 8 位。

要访问下一个值,您必须将 sizeof(int) 添加到指针,以使您的代码独立于其所使用的架构工作。

当您使用指针时,您告诉编译器指针指向的值占用了内存中该类型的空间,并且内存中的下一个内容应该是在该数量的单位(字节)之后。因此,如果您将 int 指针强制转换为 char 指针,则应将 sizeof(int) 添加到 char 指针以具有与将 1 添加到 int 指针相同的效果。这是因为根据定义,char 自动为 1 个单位,如果您要使用除 char 以外的任何内容,这将不起作用,没有与体系结构无关的类型大小规范。

【讨论】:

  • 谢谢你的解释!
猜你喜欢
  • 2021-09-20
  • 2020-11-17
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多