提问者:小点点

C++数组*(int*)((char*)ptr+8)=4;


#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]中的值,我不明白这怎么可能! :/


共1个答案

匿名用户

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

要访问下一个值,您必须将sizeof(int)添加到指针中,以使您的代码独立于使用它的体系结构来工作。

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|数组|int|char|ptr+8)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?