访问冲突写入位置

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 字节。