访问冲突写入位置
Access Violation Writing to location
我是 C++ 的新手,我不知道这个错误是什么意思。它从文件中读取并尝试将值存储在 char * [].
中
文件包含:
5,Justin,19,123-45-6789,State Farm,9876,Jessica,Broken Hand,
这是我的代码。
void Hospital::readRecordsFile(){
std::ifstream fileStream;
fileStream.open(fileName); // Opens the file stream to read fileName
char * temp [8];
int i = 0;
while(!fileStream.eof()){
fileStream.get(temp[i],256,',');
i++;
}
i = 0;
for(char * t:temp){
std::cout << t << std::endl;
}
}
错误在行 fileStream.get(temp[i],256,',');
您定义了一个包含 8 个指向 char 的指针的数组,但忘记分配内存以使指针指向有效的内存块:
char * temp [8]; // need then to allocate memory for the pointers
因此,在行
fileStream.get(temp[i],256,',')
你最终使用了不属于你的内存。
解决方案:
for(int i = 0; i<8; i++)
temp[i] = new char[256]; // we allocate 256 bytes for each pointer
但更好的是,改用 std::vector<std::string>
。
在你现在的代码中,你似乎隐含地假设文件不超过 8 行,我觉得这很难相信。如果你的文件超过 8 行,那么你最终会越界访问 8 个指针的数组,所以你会得到另一个未定义的行为(通常是段错误)。这就是为什么使用像 std::vector
这样的标准 STL 容器要好得多,以避免所有这些令人头疼的问题。
如果您必须使用指针并且想要可变数量的行,那么您必须使用指向指针的指针,
char** temp;
然后为足够的字符指针分配内存,
temp = new char* [1000]; // we believe we won't have more than 1000 lines
然后,为每个指向字符的指针分配内存
for(int i = 0; i < 1000; ++i)
temp[i] = new char[256];
程序结束时,您必须delete[]
以相反的顺序
for(int i = 0; i < 1000; ++i)
delete[] temp[i];
delete[] temp;
如您所见,越来越乱了。
您从未为 temp
中的每个指针分配内存。
你可能想要这样的东西:
for (unsigned int i = 0u; i < 8; ++i)
{
temp[i] = new char[256];
}
表示 temp
变量指向 8 个动态分配的字节缓冲区,每个缓冲区为 256 字节。
我是 C++ 的新手,我不知道这个错误是什么意思。它从文件中读取并尝试将值存储在 char * [].
中文件包含:
5,Justin,19,123-45-6789,State Farm,9876,Jessica,Broken Hand,
这是我的代码。
void Hospital::readRecordsFile(){
std::ifstream fileStream;
fileStream.open(fileName); // Opens the file stream to read fileName
char * temp [8];
int i = 0;
while(!fileStream.eof()){
fileStream.get(temp[i],256,',');
i++;
}
i = 0;
for(char * t:temp){
std::cout << t << std::endl;
}
}
错误在行 fileStream.get(temp[i],256,',');
您定义了一个包含 8 个指向 char 的指针的数组,但忘记分配内存以使指针指向有效的内存块:
char * temp [8]; // need then to allocate memory for the pointers
因此,在行
fileStream.get(temp[i],256,',')
你最终使用了不属于你的内存。
解决方案:
for(int i = 0; i<8; i++)
temp[i] = new char[256]; // we allocate 256 bytes for each pointer
但更好的是,改用 std::vector<std::string>
。
在你现在的代码中,你似乎隐含地假设文件不超过 8 行,我觉得这很难相信。如果你的文件超过 8 行,那么你最终会越界访问 8 个指针的数组,所以你会得到另一个未定义的行为(通常是段错误)。这就是为什么使用像 std::vector
这样的标准 STL 容器要好得多,以避免所有这些令人头疼的问题。
如果您必须使用指针并且想要可变数量的行,那么您必须使用指向指针的指针,
char** temp;
然后为足够的字符指针分配内存,
temp = new char* [1000]; // we believe we won't have more than 1000 lines
然后,为每个指向字符的指针分配内存
for(int i = 0; i < 1000; ++i)
temp[i] = new char[256];
程序结束时,您必须delete[]
以相反的顺序
for(int i = 0; i < 1000; ++i)
delete[] temp[i];
delete[] temp;
如您所见,越来越乱了。
您从未为 temp
中的每个指针分配内存。
你可能想要这样的东西:
for (unsigned int i = 0u; i < 8; ++i)
{
temp[i] = new char[256];
}
表示 temp
变量指向 8 个动态分配的字节缓冲区,每个缓冲区为 256 字节。