C++ 中的内存冲突
Memory Violation in c++
我在运行代码时收到以下错误:
KSU 中0x00F66754时未处理的异常。CIS308.项目5.exe:0xC0000005:访问违规写入位置0xFDFDFDFD。
我认为这是由于指针有内存,但也不是它所指向的内容。我不知道如何分配它。下面是代码,它是 Matrix 对象的构造函数方法:
Matrix::Matrix(int row, int col)
{
this->rows = row;
this->cols = col;
this->arr = new int*[row];
for (int i = 0; i < row; i++)
{
this->arr[i] = new int[col];
}
}
this->arr = new int*[row];
是扔它的东西。它是一个指向指针的指针,因此我可以像二维数组一样存储矩阵。任何帮助都非常感谢。我认为它稍后也会被抛出,但如果我能弄清楚一个,其余的也应该很容易修复。
Arr 在头文件中声明如下:
int **arr;
好的,所以在调试时,我发现 col 被传递到 0,这可能解释了错误。我以为我计算了通过它的正确值。这是主文件。我习惯 strtok 将所有内容放入 Vector 中。用户输入格式为:"1 2 3//3 2 1",其中"//"是换行符。
int main() {
vector<int> v1;
int rowCountA = 1;
int colCountA = 0;
cout << "Enter First Matrix (put // to denote row breaks): ";
char buff[200];
char *token;
char *tok;
scanf("%s", buff);
token = strtok(buff, "//");
while (token != NULL)
{
tok = strtok(token, " ");
while (tok != NULL)
{
v1.push_back(atoi(tok));
tok = strtok(NULL, " ");
colCountA++;
}
token = strtok(NULL, "//");
rowCountA++;
}
A = new Matrix(rowCountA, colCountA/(rowCountA+1));
for (int i = rowCountA; i > 0; i--)
{
for (int k = colCountA; k < 1; k--)
{
A->setElem(i, k, v1.back());
v1.pop_back();
}
}
}
正如您已经发现的那样,问题是将 0 作为维度之一传递,否则 2D 数组创建是正确的。你不应该允许col
为 0,最坏的情况(假设空输入(,让它为 1。
无论如何,您没有正确解析输入:
scanf("%s")
只返回第一个数字,因为它在第一个空格处停止。代码应改用fgets()
。
使用 C 字符串函数,应将scanf("%s", buff);
替换为:
fgets(buff, sizeof(buff)/sizeof(char), stdin);
但是,您不能嵌套对strtok()
的调用。当您在//
上拆分字符串,然后在每个令牌上调用strtok
时,您将无法再检索下一行,因为它忘记了基于 //
的标记化。
下面是一个粗略的等效于您使用C++ I/O 进行的解析(尽管代码确实存在一些其他错误(:
string sbuff;
getline(cin, sbuff);
stringstream ss(sbuff); // header file <sstream>
while (ss >> sbuff) {
if (sbuff == "//") {
rowCountA++;
}
v1.push_back(atoi(sbuff.c_str()));
colCountA++;
}
相关文章:
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++中的内存分配(引发异常:读取访问冲突)
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- 使用加速进程间创建消息队列 - 内存访问冲突
- C 指针转换会导致内存访问冲突
- 为什么创建进程 API 调用会导致内存访问冲突?
- 访问共享内存时出现读取访问冲突
- 这Microsoft CFileDialog 示例是否会导致潜在的内存冲突
- Python C++扩展 - 内存泄漏或访问冲突
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- C 程序内存冲突依赖于 std::cout (?)
- 使用 std::map 作为本地成员的内存访问冲突
- 编译哈希算法时出现内存访问冲突错误
- 使用内存访问冲突错误
- 堆栈引发内存访问冲突
- 使用 Boost::序列化时内存访问冲突
- 调用std::vector::empty()时内存访问冲突读取位置
- 简单加密程序集程序-写入内存位置时发生访问冲突
- 动态分配内存时发生访问冲突
- 修复 std::map 中的冲突内存泄漏