vector中保存字符指针的总结

vector< char * >奇遇

  vector,相信接触过c++的开发人员都不陌生。可以简单的理解为其是能够动态扩展的数组。闲话少叙,接下来描述曾经遇到过的一个问题。
  打算使用vector来保存一批字符串,自然而然的想到了使用如下方式:

vector<char *> vchar;

vchar用来保存字符串。先来个示例:

int main()
{
    vector<char *> vchar;
    vchar.push_back(const_cast<char *>("hello"));
    vchar.push_back(const_cast<char *>("world"));
    vchar.push_back(const_cast<char *>("welcome"));

    vector<char *>::iterator begin = vchar.begin();
    vector<char *>::iterator end = vchar.end();
    while (begin != end)
    {
        cout << *begin++ <<endl;
    }

    return 0;
}

输出结果

hello
world
welcome

vchar中保存的值可能如下所示(第一行为索引,第二行为指针):

0 1 2 3
0x401ed3 0x401ed9 0x401edf

内存分布可能如下:

指针 内存内容
0x401ed3 h
e
l
l
o
0
0x401ed9 w
o
r
l
d
0
0x401edf w
e
l
c
o
m
e
0

下面看一下异常的代码

int main()
{
    vector<char *> vc;
    stringstream ss;

    for (int i = 0; i < 3; ++i)
    {
        ss << i;
        vc.push_back(const_cast<char *>(ss.str().c_str()));
        ss.str("");
    }

    vector<char *>::iterator it;
    for (it = vc.begin(); it != vc.end(); ++it)
        cout << *it << endl;

    return 0;
}

结果出乎意料,竟然是3个2

2
2
2

猛然一看,挺困惑,静下来一分析,嗯嗯,原来如此啊。如下:
vc中存储的是指针,可能如下:

0 1 2 3
0x1bee258 0x1bee258 0x1bee258

vector中的元素均指向同一个地址,在循环结束时,这块内存中的值也就变成了2,所以它们的值自然也就是同一个了。
找到了原因,问题自然就好解决了。一种方法,每次放入不同的指针。更简单的一种方案是,使用vector< string>来代替vector< char *>。

int main()
{
    vector<string> vs;
    stringstream ss;

    for (int i = 0; i < 3; ++i)
    {
        ss << i;
        vs.push_back(ss.str());  // 每次放入一个新的string对象
        ss.str("");
    }

    vector<string>::iterator it;
    for (it = vs.begin(); it != vs.end(); ++it)
    {
        cout << *it << endl;
        cout << static_cast<const void *>(&(*it)) << endl;
    }

    return 0;
}

输出结果可能如下:

0
0x95d310
1
0x95d318
2
0x95d320

可以看到,三个对象的地址明显不是同一个,表明vs中存放的是三个不同的对象。

使用vector或其他容器的时候,如果其保存的是指针类型的数据,一定要留心。

时间: 2024-09-18 14:07:33

vector中保存字符指针的总结的相关文章

malloc-C语言中的字符指针操作问题,如何释放字符指针空间?

问题描述 C语言中的字符指针操作问题,如何释放字符指针空间? 源码如下: #include #include #include void main() { char s1; char *s2 = "bbb"; char *s3 = "ccc"; s1 = (char)malloc(sizeof(s2)); strcpy(s1, s2); strcat(s1, s3); //free(s2); //free(s3); printf("%s ", s

C/C++中字符指针数组及指向指针的指针的含义

就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针. 先看下面的代码,注意看代码中的注解: #include <iostream>#include <string>using namespace std; void print_char(char* array[],int len);//函数原形声明void main(void){//-----------------------------段1----------

c++怎么将字符串中的汉字和数字分别存入不同字符指针所指空间?

问题描述 c++怎么将字符串中的汉字和数字分别存入不同字符指针所指空间? 如字符串:测试1次 将 测试 存入char*s 将 1 存入char* p 解决方案 只能想到一个一个字符的遍历,然后分别赋值给2个数组.如果确定输入的是"字符,字符,数字,字符"的格式,可以接收的时候就用格式化接收把他们分开. 解决方案二: #include int isalnum(int c); int isalpha(int c); int isascii(int c); int isblank(int c

c++-字符串存储在字符指针中遇到的问题

问题描述 字符串存储在字符指针中遇到的问题 用一个结构体 存储算式中的每一个独立标志 如:算式"123+5*6" 那么就依次将123.+.5.*.6分别存储在每一个RPNNode的token中. 初始化为 运行程序 调用函数 函数中再调用函数 然后运行程序时总是报错,设置了断点并调试结果如下 按正常来说pstr[i]的值应该为"1",为什么会是"49'1'"呢?49是怎么回事,求大神解答 解决方案 49是字符串1的acsic码的值 解决方案二:

API入门系列之三 -那迷惑人的Windows字符和字符指针类型

大家好,通过前面两篇打头文章,我也看了留言,感谢那些给我提意见的人和指出错误之处的人.再次谢谢你们的支持.另外,Windows SDK编程交流群已经建立了,欢迎各位志同道合者加入进行交流(群号:81543028) 本打算通过前面两篇文章的讲解,后来的系列就可以通过使用一些简单的,常用的API写一些示例程序的讲解进行,但是发现还有一个不得不先讲一讲的要点,Windows下和字符串操作有关的数据类型.我看留言中也有几位朋友提到了,那我就在这篇中讲它吧.不会很枯燥的,各位慢慢看下去就是了. 下面我罗列

c++-关于C++ vector中存放数组,出现问题

问题描述 关于C++ vector中存放数组,出现问题 我想定义一个vector,里面放几个数组,每个数组长度为2,数组的值由控制台输入. 先定义两个整数M,N,N表示vector中数组的数目,M是另外一个整数,答主可以不必关心. 当M=N=-1时跳出循环.整数J,F是存储在数组中的值,也由控制台输入. 然后对vector排序,排序规则定义在cmp函数中,按照J/F的值由大到小排序. 比如:对于{[7,2],[4,3],[5,2]},排序后为{[7,2],[5,2],[4,3]} 代码如下: #

C++中auto_ptr智能指针的用法详解_C 语言

智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有

c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求

问题描述 c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求 #include #include int main() { char*s; scanf("%s",s); //printf("%sn",s); //int n = strlen(s); //printf("%dn",n); char ret[56]; return 0; } 解决方案 s只是指针变量,没有分配内存 char*s; s = mall

C结构中使用字符指针

下面的例子定义了两个结构,由于成员中存在字符串,所以结构一使用了字符数组,而结构二使用字符指针. #include <stdio.h> #define LEN 20 struct info { char first[LEN]; char last[LEN]; int age; }; struct pinfo { char * first; char * last; int age; }; int main() { struct info one = {"Opw", &quo