一周前,我开始了我的 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) 有一个词实例,用于表示以下内容:
字符序列“abcdefgh”源自一组非大写英文字母,即{a,b,...,y,z}。这个序列被实例化了两次,并存储在两个内存位置,比如 A 和 B。String1 指向 A(假设),String2 指向 B。问题中没有概念上的混淆。
我想理解的是内存位置A和B的属性差异,即为什么其中一个是不可变的。