簡體   English   中英

將不同的值存儲在char *向量中,數組中的所有位置都具有相同的值

[英]Storing differnt values in char* vector, all positions in array have same value

讓我解釋一下我的問題

首先,假設我隨機生成數字“ 5”。

我想將此整數轉換為char *,以便可以使用Draw_String()方法顯示它。

我想將“ 5”作為中心位置,該位置應為char * array [2]中的[1]。

在[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*

您的代碼具有未定義的行為:它從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);

現在,您需要在完成后在blocks每個元素上調用delete[] ,以避免內存泄漏。

如果您需要使用char *而不是std :: string,則需要分配它並復制復制指針的字符串內容。

代替:

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())

現在,無論發生什么轉換,您都可以控制轉換后的數據。 (請注意在不需要時也將其刪除)

否則,當轉換更改時,轉換后的內容可能會更改或指向無效數據。 這是因為在原始實現中,轉換后的對象指向由轉換對象管理的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM