wylaa 发表于 2021-1-26 17:23:55

为什么权限访问冲突,大佬们看看

#include <stdio.h>

void f(int *p1, int n)
{
        int *p, temp, *i, *j, m;
        m = (n - 1) / 2;
        i = p1;
        j = p1 - 1 + n;
        p = p1 + m;
        for (;i <= (p+1);i++, j--)
        {
                temp = *i;    //引发了异常: 读取访问权限冲突。i 是 0x4。
                                     

                *j = *i;
                *j = temp;
        }
}


void main()
{
        int m, arr = {4,8,9,7,6,4,26,9,5,2};
        int *p;
        m = 0;
        p = arr;
        f(p, 10);
        for (m = 0;m < 10;m++)
        {
                printf("%d ", arr);
        }
}

风过无痕1989 发表于 2021-1-26 19:32:47

本帖最后由 风过无痕1989 于 2021-1-26 19:43 编辑

变量 i 既作为循环变量,就不要再用作为其他变量,将 它改为其他的变量即可
由于不知道你的程序想要达到什么目的,无法帮你修改程序

#include <stdio.h>

void f(int *p1, int n)
{
      int i, *p, temp, *j, *k, m;
      m = (n - 1) / 2;
      k = p1;
      j = p1 - 1 + n;
      p = p1 + m;
      for (;i <= (p+1);i++)
      {
                temp = *k;
                                       

                *j = *k;
                *j = temp;
      }
}


void main()
{
      int m, arr = {4,8,9,7,6,4,26,9,5,2};
      int *p;
      m = 0;
      p = arr;
      f(p, 10);
      for (m = 0;m < 10;m++)
      {
                printf("%d ", arr);
      }
}

sunrise085 发表于 2021-1-26 20:18:10

问题应该不在你标注的那一行,而应该在下面两行
*i和*j是取地址对应的值,只能做赋值运算符的右值,不能做赋值运算符的左值
具体如何修改,我看看,一会儿再给你修改结果

kishere 发表于 2021-1-27 09:53:28

楼上都没答道点子上啊, 这里问题是 main 里, 给p赋值的时候, p是一个指针啊, 直接给p赋值arr, 意思就是让p指向地址0x4, 然后调用函数时, i = p1 让 i 也等于了0x4, 这时你再去解引用获取0x4的内容那当让不得行, 0x4肯定是个保护的地址, 而且就算没保护, 你也没有初始化这个地址存放的值.
页: [1]
查看完整版本: 为什么权限访问冲突,大佬们看看