【发布时间】:2021-12-11 00:48:35
【问题描述】:
我目前正在试验指针,我的代码有几个问题
ps。这只是为了试验我不会在任何代码中使用它
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
struct obj
{
int* IntPtr;
obj()
{
IntPtr = new int[2];
IntPtr[0] = 123;
IntPtr[1] = 456;
}
};
int main()
{
obj MyStruct;
long long int* Adress = (long long int*) & MyStruct; //pointer to a struct
//change value in struct
*(long long int*)(*Adress + sizeof(int)) = 789;
std::cout << "get value by pointer: " << (int)*(long long int*)(*Adress + sizeof(int)) << std::endl; //std::cout crashes my program
printf("get value by pointer: %d\n", (int)*(long long int*)(*Adress + sizeof(int)));
printf("get value from struct: %d\n", MyStruct.IntPtr[1]);
return 0;
}
-
为什么 std::cout 会使我的程序崩溃?我不得不使用 printf 函数来解决这个问题
-
我可以从我的主函数中删除 IntPtr 吗?像
delete[] (long long int*)*Adress;这样的东西然后创建新的?喜欢:int* Itemp = new int[5]; *地址 = (long long int)Itemp;
编辑:这只是一个关于如何在strcut obj 中访问int* IntPrt 的实验,当它是private: 时,我不会使用其他方法。
即使使用 delete[] 和 new 的代码在我的编译器上也能正常工作
谢谢大家的解释
【问题讨论】:
-
为什么要投那么多?为什么要手动管理内存?
& MyStruct; //pointer to a struct- 是的 - 但是你转换成long long*- 为什么?然后您取消引用该指针并使用它来形成您取消引用的另一个指针。 未定义的行为。丰富。 -
您的代码有强制转换。演员阵容很差。取下石膏。修复警告。
-
(*Adress + sizeof(int))不要这样做(除非你真的了解内存中字节的底层布局,即使那样通常还有更好更安全的方法) -
@TheUndeadFish 不,永远不要这样做。这是未定义的行为,即使做得“正确”。
-
long long int* Adress不是指向结构或obj的指针。它是一个指向long long int的指针。