一周前我开始使用C++进行冒险.我已经阅读了很多关于C++的内容.我正在试验以下内容:
char * String1 = "abcdefgh";
Run Code Online (Sandbox Code Playgroud)
然后,我尝试以下列方式修改其值:
String1[2] = 'f';
Run Code Online (Sandbox Code Playgroud)
这导致了UNHANDLED EXCEPTION.但以下结果是正确执行:
char String2[9]="abcdefgh";
String2[7]='s';
Run Code Online (Sandbox Code Playgroud)
我尝试使用DUMPBIN提取有关使用上述代码生成的二进制文件的信息.DUMPBIN是一个Visual Studio工具.我使用/ ALL选项提取二进制文件中包含的每个信息.
我可以在RAWDATA部分看到两个"abcdefgh"实例.我理解为什么.
我的问题如下:
1)虽然String1和String2都是指向同一字符序列的两个不同实例的指针,但为什么String1操作不合法呢?
2)我知道编译器生成一个SYMBOL TABLE来映射变量名及其值.有没有可以在Windows操作系统中可视化SYMBOL TABLE的工具?
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.
Run Code Online (Sandbox Code Playgroud)
这些东西如何进入二进制可执行文件?在二进制文件中显示这些消息的目的是什么(显然不可读)?
编辑:我的问题1)有一个单词INSTANCES,用于表示以下内容:
字符序列"abcdefgh"源自一组非大写的ENGLISH ALPHABETS,即{a,b,...,y,z}.该序列是两次INSTANCIATED并存储在两个存储位置,比如A和B. String1,指向A(假设),String2指向B.在问题中没有概念混淆.
我想要理解的是内存位置A和B的属性的差异,即为什么其中一个是不可变的.
注意:下面的所有代码都是指函数中的作用域.
下面的代码用数据初始化可写缓冲区string2.编译器生成初始化代码以从只读编译器生成的字符串复制到此缓冲区.
char string2[] = "abcdefgh";
Run Code Online (Sandbox Code Playgroud)
下面的代码存储一个指向只读的,编译器生成的字符串的指针string1.字符串的内容位于可执行映像的只读部分.这就是修改它会失败的原因.
char * string1 = "abcdefgh";
Run Code Online (Sandbox Code Playgroud)
您可以通过string1指向可写缓冲区来使其工作.这可以通过复制字符串来实现:
char * string1 = strdup("abcdefgh");
....
free(string1); // don't forget to free the buffer!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |