C++中关于在vs中查看字符串的内存地址的问题

StrugglePeach 2016-08-06 08:56:51
我在使用vs2013学习C++时,遇到了这样一个问题

在main函数中我定义了一个字符串hex,然后我开始调试时,在内存窗口中查看到的hex内容与我定义的内容不一致,这是为什么?
代码如下:
int main()
{
string hex = "0123456789ABCDEF";

decltype(hex.size()) n = 0;
while (n <= hex.size())
{
hex[n] = 'F';
cout << "hex[" << n << "] address is " << &hex << "\t" << (&hex) + n - 48 << endl;
n++;

}

cout << hex << endl;

system("pause");

return 0;
}


我现在只想从内存窗口中查看到hex字符串的存储情况,我应该怎么查看?我那样cout出hex的地址的方法为什么不行?麻烦各位帮忙解释一下,谢谢!


...全文
534 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
StrugglePeach 2016-08-10
  • 打赏
  • 举报
回复
谢谢名位,学到了很多
幻夢之葉 2016-08-08
  • 打赏
  • 举报
回复
引用 7 楼 StrugglePeach 的回复:
[quote=引用 4 楼 lm_whales 的回复:]
#include <iostream>
using namespace std;

inr main(){
string shex ="0123456789ABCDEF";
cout<<"Value =" <<shex<<endl; //输出字符串的值
cout <<"Object adress =" <<&shex <<endl;//输出string 对象shex 的地址
cout <<"The string adress ="<<(void*) (&shex[0])<<endl;//输出串地址
cin.get();
return 0;
}
我按照你说得方法试了,查看内存中的情况,得到如下结果: 可以发现串地址(void*)(&shex[0])中存放的是字符串的内容,但是,string 对象的地址中的内容包含了shex字符串的地址,而不是在对象地址中直接包含了字符串内容,这是为什么呢? 谢谢![/quote] 因为字符串实际值是存储在动态分配的内存上的,这是实现上。(但是我不保证所有的标准库都是一样的,比较C++要求同样的结果并不要求具体的实现)。 class MyString { MyString() { p = new char[1]; } MyString(char *str){ p = new char[strlen(str)+1]; } char& operater [](size_t i){ return p[i]; } // 返回p[i],&p[0] 即是返回实际存储字符串数组的实际地址 private: char *p; } 对对象本身取地址,返回的是对象内存布局 首个成员的地址,这里大概是 p 这个成员的地址 以上代码只是演示,实际上string复杂得多(模板, 内存分配等方面都更加巧妙)
StrugglePeach 2016-08-08
  • 打赏
  • 举报
回复
受限于目前的水平,还是不太明白,先mark,以后功力达到了,再回来看看
赵4老师 2016-08-08
  • 打赏
  • 举报
回复
仅供参考:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
lm_whales 2016-08-08
  • 打赏
  • 举报
回复
每个编译器实现的 string 对象,的大小都不同 有24Bytes,28Bytes,32Bytes 也有16 Bytes的吧 有一种实现是 <15Bytes 长度的字符串,放在string 对象内部 大的 再分配内存存放 每一种string 实现,都定义了一些(自认为)必要的成员 其中一般有一个指针,一个串长,一个容量。可能还有引用计数(used count,reference count)
lm_whales 2016-08-08
  • 打赏
  • 举报
回复
对象根据类的实现不同,结构不同 string 本质上是标准模板库中的一个模板类的一个实例 因为 字符串本质上是个字符数组 所以string(很多实现中) 内部有个指针,指向一块动态分配的内存。 这块内存,存放字符串的内容 实际上,string内部,至少还有两个成员 一个表示分配的容量 ------------ 目的是,每次多分配一点,防止频繁分配内存, 这是用空间换时间,提高摊还效率,降低摊还时间复杂度, 另外也省得,内存有太多碎片。 --------- 一个表示当前字符个数, -------- 省得求串长这个经常使用的操作,总是遍历所有字符,(如C字符串)。 -------- string 的实现,和vector 极为相似,尤其是内部结构。 都是某种动态数组
StrugglePeach 2016-08-08
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
#include <iostream>
using namespace std;

inr main(){
string shex ="0123456789ABCDEF";
cout<<"Value =" <<shex<<endl; //输出字符串的值
cout <<"Object adress =" <<&shex <<endl;//输出string 对象shex 的地址
cout <<"The string adress ="<<(void*) (&shex[0])<<endl;//输出串地址
cin.get();
return 0;
}

我按照你说得方法试了,查看内存中的情况,得到如下结果:

可以发现串地址(void*)(&shex[0])中存放的是字符串的内容,但是,string 对象的地址中的内容包含了shex字符串的地址,而不是在对象地址中直接包含了字符串内容,这是为什么呢?

谢谢!
lm_whales 2016-08-07
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

inr main(){
string shex ="0123456789ABCDEF";
cout<<"Value =" <<shex<<endl; //输出字符串的值
cout <<"Object adress =" <<&shex <<endl;//输出string 对象shex 的地址
cout <<"The string adress ="<<(void*) (&shex[0])<<endl;//输出串地址
cin.get();
return 0;
}
PS: hexstd 名空间内,的输入输出操纵子,是经常会用到的 因此,定义变量最好不要跟他同名 不然输出的时候,会遇到麻烦,至少会给自己带来困扰。
paschen 版主 2016-08-07
  • 打赏
  • 举报
回复
把hex换个名字,或者不要使用using namespace std; 因为和std名称空间下的hex重名了
lm_whales 2016-08-07
  • 打赏
  • 举报
回复
string shex ="0123456789ABCDEF";
cout<<"Value =" <<shex<<endl; //输出字符串的值
cout <<"Object adress =" <<&shex <<endl;//输出string 对象shex 的地址
cout <<"The string adress ="<<(void*) (&shex[0])<<endl;//输出串地址
cout <<"operon hex adress ="<<(void *)&hex<<endl;//输出操纵子的地址

//Value =0123456789ABCDEF
//Object adress =0x9ffdb0
//The string adress =0x1141650
//operon hex adress =0x403420
StrugglePeach 2016-08-06
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:

cout << &hex << endl;
麻烦你看一下
StrugglePeach 2016-08-06
  • 打赏
  • 举报
回复
嗯,你说得方法我试了,&hex打印出来的值是0x3efd20, 我从内存窗口查看该地址的值是28 98 48 00,这时里面的值不是hex的内容,我把该地址的内容作为内存地址,即0x00489828,在内存窗口中显示的也不是hex的值,但是在0x00489828下面的0x00489870里面确是hex的内容,也就是这样: &hex = 0x3efd20; 0x3efd20- 0x3efd24内容:28 98 48 00 0x00489828内容:不是hex的内容,具体值我忘记了 0x00489870 内容:0123456789ABCDEF 这是为什么?
小灸舞 2016-08-06
  • 打赏
  • 举报
回复

cout << &hex << endl;

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧