gpt4 book ai didi

c++ - 使用 new 时变量被覆盖

转载 作者:行者123 更新时间:2023-11-30 04:01:20 24 4
gpt4 key购买 nike

我在 C++ 中遇到动态内存分配问题。我必须编写一个函数来解决存储在 .dat 文件中的迷宫问题。墙由#以空格隔开,有些点是单词,需要读入任意长度的c字符串。然后将此 c 字符串存储在迷宫数组中。我的问题是我的 c 字符串不断覆盖内存中以前的字符串。我怎样才能告诉程序不要覆盖某些内存块?

这是初始化迷宫数组的函数:

int LoadMaze(Maze& maze, int& width, int& height, char fname[])
{
ifstream ifs(fname);
int stringLength;
char inputChar;
char* newCString;

if (ifs.good())
{
ifs >> width >> height;

maze = new char*[width*height];

for (int i=0;i<width*height;i++)
{
stringLength = 0;
inputChar = '1';
while(inputChar != ' ')
{
inputChar = ifs.get();
if(inputChar != ' ' && inputChar != '\n')
{
newCString = resizeChar(newCString, stringLength);
newCString[stringLength++] = inputChar;
}
}
//maze = resizeMaze(maze, i);
maze[i] = newCString;
}
ifs.close();
return 1;
}
else
{
cerr << "File not found." << endl;
return 0;
}
}

由于 C 字符串必须是任意长度,resizeChar 将 cstring 大小增加一。然后指向该 cstring 的指针存储在迷宫中。

char* resizeChar(char* stringStart, int oldSize)
{
int counter = 0;
char* tempPtr = new char[oldSize + 1];

for(counter = 0; counter < oldSize; counter++)
{
*(tempPtr + counter) = *(stringStart + counter);
}
delete[] stringStart;

return (tempPtr);
}

最佳答案

您正在向您的函数传递一个未初始化的值:

char* newCString;

....

newCString = resizeChar(newCString, stringLength);

要解决此问题,您需要为 newCString 提供一个合理的初始值,并确保 resizeChar 可以处理该情况。

最好每次循环都初始化newCString。这也避免了您为迷宫的每一行使用相同缓冲区的问题。

另一个主要问题是您永远不会以 null 终止您正在构建的字符串。因此,一旦您进入 maze[i] = newCString;,该行仅指向一些字符,但您丢失了字符串中有多少个字符的信息。如果您尝试输出此字符串,那么您将缓冲区溢出并开始输出垃圾。

您需要分配比字符串中字符数多 1 个字节,并使最后一个字节为 '\0'

关于c++ - 使用 new 时变量被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com