C++ 中的内存冲突

Memory Violation in c++

本文关键字:冲突 内存 C++      更新时间:2023-10-16

我在运行代码时收到以下错误:

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++;
}