在char * vector中存储不同的值,数组中的所有位置都具有相同的值

时间:2015-10-24 10:52:05

标签: c++ arrays

让我解释一下我的问题

首先,想象一下我随机生成数字“5”。

  

我想将此整数转换为char *,以便我可以使用my显示它   Draw_String()方法。

     

我希望将“5”作为中心位置,它将是[1]   char * array [2]。

     

在位置[0]中,我想要较低的相邻数字“4”

     

在位置[2]中,我想要较高的相邻数字“6”

所以

[0] = 4    [1] = 5    [2] = 6

然后我想显示矢量位置的内容,就像这样。

4
5
6

但是,我的输出更像是这样:

5
5
5

无论我生成什么数字,无论我执行哪些操作,我的所有矢量位置都只会得到数字“5”。

代码

int startpoint = rand() % 7 + 1;
int assigner = -1;
for (int i = 0; i < 3; i++)
{
    startpoint += assigner;
    convert = std::to_string(startpoint);
    char *converted = &convert[0u];
    blocks.push_back(converted);
    assigner++;
}

//spin around twice for visual effect.

for (int counter = 0; counter < 2; counter++)
{
    Draw_String(drawY, drawX - 1, blocks.at(0));
    Draw_String(drawY, drawX, blocks.at(1));
    Draw_String(drawY, drawX + 1, blocks.at(2));
}

如果有人能提供帮助,我会很感激。

不要让我摆脱char*

2 个答案:

答案 0 :(得分:1)

您的代码具有未定义的行为:它从conver字符串

内部收集指向内部字符串缓冲区的指针
char *converted = &convert[0u];

但是下次重新分配convert字符串时缓冲区可能会变为无效。您看到的行为表明缓冲区被重用,而不是重新分配,因此相同的指针存储在blocks向量中。

最好的解决方案是直接存储std::string,因为它可以为您管理复制和取消分配:

std::vector<std::string> blocks;
...
blocks.push_back(std::to_string(startpoint));

如果您坚持使用指针,请在将其添加到容器之前复制该字符串:

char *copy = new char[strlen(converted)+1];
strcpy(copy, converted);
blocks.push_back(copy);

现在,为了避免内存泄漏,您需要在delete[]的每个元素上调用blocks

答案 1 :(得分:1)

如果你需要使用char *而不是std :: string,你需要分配它并复制字符串intead的内容来复制指针。

而不是:

char *converted = &convert[0u];

使用:

char *converted = malloc(convert.length() + 1); // number + '\0'
// can also use char *converted = new char[convert.length() + 1];
strcpy(converted, convert.c_str())

现在,无论转换什么,您都可以控制转换的数据。 (当你不需要时也要小心删除它)

否则,当转换更改时,转换后可以更改或指向无效数据。 这是因为在原始实现中,转换后指向由转换对象管理的数据。