引发了异常: 读取访问权限冲突。请问出错的原因是什么?怎么解决?


#include <stdio.h>
int main() {
    int a[3][3];
    int i,j;
    int *p;
    int o;
    p = *a;
    printf("请输入:");
    for (i = 0; i < 9; p++&&i++) {
        scanf_s("%d", p);
    }
    for (i = 0; i < 9; p-- && i++) {
        printf("  %d", *(p-1));
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            printf(" %d", a[i][j]);
        }
    }
    printf("\n");
    for (p = *a, i = 0; i<8; p++)
    {
        if (*p <= *(p + 1)) {//报错从这里开始
            o = *p; 
            *p = *(p + 1);
            *(p + 1) = o;
        }
    }
    for (i = 0,p=*a; i < 9; p++ && i++) {
        printf("  %d", *(p ));
    }
    return 0;
}

p++&&i++
这样会造成短路
应该写
p++,i++

for (p = *a, i = 0; i<8; p++)
这里应该是
for (p = *a, i = 0; i<8; p++,i++)
如果你要冒泡排序,应该双循环,你这样排序不起来,只是其中一趟

报错的本质为内存访问问题:
表现有:
先等
数组越界
对于分配到的空间,未进行预处理
空指针,指针越界(本文正是这个问题)
解决方式:

  • 检查是否越界
  • 对于申请到的空间,是否给了默认值
  • 指针是否越界

&&改成,

【以下回答由 GPT 生成】

答案:

错误的原因是在代码的以下两个地方:

  1. for循环中的 p++ & i++p-- & i++。这是一个语法错误,应该使用逗号表达式来同时增加 pi 的值,而不是使用 & 操作符。正确的写法是 p++, i++p--, i++

  2. 最后一个for循环中的语句 p++ && i++ 。 该语句使用了 && 运算符,但这并不是正确的语法,应该使用逗号表达式来同时增加 pi 的值。正确的写法是 p++, i++

修正后的代码如下:

#include <stdio.h>

int main() {
    int a[3][3];
    int i,j;
    int *p;
    int o;
    p = *a;
    printf("请输入:");
    for (i = 0; i < 9; p++, i++) {
        scanf_s("%d", p);
    }
    for (i = 0; i < 9; p--, i++) {
        printf("  %d", *(p-1));
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            printf(" %d", a[i][j]);
        }
    }
    printf("\n");
    for (p = *a, i = 0; i<8; p++ ) {
        if (*p <= *(p + 1)) {
            o = *p; 
            *p = *(p + 1);
            *(p + 1) = o;
        }
    }
    for (i = 0,p=*a; i < 9; p++, i++) {
        printf("  %d", *(p ));
    }
    return 0;
}

请注意,上述修复只是修复了语法错误,并没有修改程序的主要逻辑。如果程序的目标是正确排序数组,还需要进一步修改代码以实现此目标。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^