gpt4 book ai didi

c++ - C++(native)二进制中各种数据类型的变量是如何存储的?

转载 作者:太空宇宙 更新时间:2023-11-04 14:39:47 28 4
gpt4 key购买 nike

一周前,我开始了我的 C++ 冒险之旅。我已经阅读了很多关于 C++ 的文章。我正在尝试以下内容:

 char * String1 = "abcdefgh";

然后,我尝试通过以下方式修改它的值:

 String1[2] = 'f';

这导致了未处理的异常。但以下结果会导致正确执行:

 char String2[9]="abcdefgh";

String2[7]='s';

我尝试使用 DUMPBIN 提取有关使用上述代码生成的二进制文件的信息。DUMPBIN 是一个 Visual Studio 工具。我使用/ALL 选项提取二进制文件中包含的所有信息。

我可以在 RAWDATA 部分看到两个 "abcdefgh" 实例。我明白为什么。

我的问题如下:

1) 尽管 String1 和 String2 本质上都是指向同一字符序列的两个不同实例的指针,但为什么对 String1 的操作不合法?

2) 我知道编译器会生成一个符号表来映射变量名及其值。有什么工具可以在 Windows 操作系统中可视化符号表吗?

3) 如果我有一个整数数组而不是字符序列,它可以在 RAWDATA 中找到吗?

我还可以在 RAWDATA 中看到以下内容:

Unknown Runtime Check Error.........
Stack memory around _alloca was corrupted.......
....A local variable was used before it was initialized.........
....Stack memory was corrupted..
........A cast to a smaller data type has caused a loss of data.
If this was intentional, you should mask the source of the cast with the appropriate bitmask.

这些东西如何进入二进制可执行文件?将这些消息放入二进制文件(显然不可读)的目的是什么?

编辑:我的问题 1) 有一个词 INSTANCES,用于表示以下内容:

字符序列“abcdefgh”源自一组非大写的英文字母,即{a,b,...,y,z}。这个序列被实例化了两次,并存储在两个内存位置,比如 A 和 B。String1 指向 A(假设),String2 指向 B。问题中没有概念上的混淆。

我想理解的是内存位置 A 和 B 的属性差异,即为什么其中一个是不可变的。

最佳答案

注意:以下所有代码均指函数内的范围。

下面的代码初始化一个带有数据的可写缓冲区string2。编译器生成初始化代码,将只读编译器生成的字符串复制到此缓冲区。

char string2[] = "abcdefgh";

下面的代码string1 中存储了一个指向编译器生成的只读字符串的指针。该字符串的内容位于可执行镜像的只读部分。这就是修改它会失败的原因。

char * string1 = "abcdefgh";

您可以通过将 string1 指向可写缓冲区来使其工作。这可以通过复制字符串来实现:

char * string1 = strdup("abcdefgh");
....
free(string1); // don't forget to free the buffer!

关于c++ - C++(native)二进制中各种数据类型的变量是如何存储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10949073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com