【问题标题】:What should I do with unhandled exception我应该如何处理未处理的异常
【发布时间】:2026-01-30 19:35:01
【问题描述】:

我尝试了很多事情,但它仍然告诉我,存在未处理的异常:VS 中的访问冲突写入位置。但是当我对一维数组进行排序时不会发生这种情况。接下来我可以尝试什么?

int main(void) {
   static int a[3][4]{}, ab[3][4]{};
   int i, j, k, N, M;
   int* a1=nullptr;
   printf("Matrica mora da ima velicinu 3 sa 4\n");
   printf("Enter the order \n\n\t");
   scanf_s("%d%d",&N ,&M);
 for (i = 0;i < M;++i)
{
    for (j = 0;j < N;++j)
    {
        scanf_s(" %d", &a[i][j]);
        ab[i][j] = a[i][j];
    }
    printf("\n");
}

for (i = 0;i < M;++i) {

    for (j = 0;j < N;++j) {

        printf(" %d", a[i][j]);

    }

    printf("\n ");
}
    
//classic sorting
for (i=0; i < M; ++i)
{
    for (j = 0;j < N;++j)
    {
        for (k = j + 1;j < N;++k)
            if (a[i][j] > a[i][k])
            {
                *a1 = a[i][j]; // there is exception thrown
                a[i][j] = a[i][k];
                a[i][k] = *a1;
            }
    }
}

【问题讨论】:

  • 使用调试器。赋值时a1的值是多少?
  • a1 值为 0 和?
  • static int a[3][4]{} 不是有效的 C 语法。这是一个有效的 C++ 语法。 C 和 C++ 是不同的语言。如果您使用 C 编写,请使用 C 编译器。如果您使用 C++ 编写,请使用 C++ 功能,并将您的问题标记为“c++”。

标签: c unhandled


【解决方案1】:

首先,数组的静态分配存在问题,但在用户输入NM 后没有对其进行清理。这意味着您只分配了3x4 的矩阵,但用户可以输入和写入任意维度的矩阵(例如10x10),这可能会导致访问冲突。

我建议对输入值进行消毒,例如

// It's always better to have limits as constant.
const int MAX_N = 3;
const int MAX_M = 4;
static int a[MAX_N][MAX_M];
...

scanf_s("%d%d",&N ,&M);

// Check if the dimensions can be fitted into the statically allocated array.
if(N > MAX_N || N <= 0 || M > MAX_M || M < 0)
{
    // indicate invalid dimensions, either by returning from main with -1
    // or calling exit(-1), or throwing an exception.
    return -1;
}

如果输入不超过3x4,另一件可能有问题的事情-i0 变为M,而不是N(我所期望的),这也可能是有问题的。矩阵寻址在 C/Cpp 中的工作方式是将矩阵线性化为数组,使用a[i][j] 访问它会导致使用a[i*MAX_J + j] 访问数组。在您的情况下,数组具有12 元素(3x4)和MAX_J=4,因此使用反向索引集访问它a[4][3] 将访问a[4*4+3]=a[19],它将从数组外部访问内存。

在访问冲突写入问题上,a1 未分配,因此当您尝试执行*a1= ... 时,您正在写入nullptr,这是一个受保护的地址,因此写入时出现访问冲突。解决这个问题的方法是:

  • a1 成为int 变量(不是指针)
  • 首先通过执行a1 = malloc(sizeof(int));a1 分配内存,然后在与free(a1) 一起使用后释放它(但由于它只是一个元素,我建议将a1 转换为int)李>
  • 分配矩阵元素的地址,如a1=&amp;a[i][j],但这在您的情况下逻辑上无效(之后,您写入指针指向的位置,因此原始值将丢失)。

一维数组没有发生这种情况的原因可能是因为倒置维度 - 矩阵可能是1x4,但您将以4x1 访问它,并且您使用@ 对所有值进行排序987654352@ 索引从01,并且由于只有一个值,因此您不会进入k 循环。

【讨论】:

  • 在 C 中,您通常不会将 malloc 的 void* 结果转换为目标类型。你知道你可以edit我们的答案,请不要添加新的东西作为评论。
最近更新 更多