C 读取访问冲突 - 指针
Posted
技术标签:
【中文标题】C 读取访问冲突 - 指针【英文标题】:C read access violation - Pointers 【发布时间】:2022-01-10 08:51:06 【问题描述】:我是 C 新手,对 Visual Studio Code 有点困惑。
我不明白那是什么意思。
当我在另一个编译器中运行代码时,它确实会运行。
void swap(int* x, int *y);
int exe1(int* num1Ptr, int* num2Ptr, int* num3Ptr);
int main()
int a = 123, b = 456 , c =4;
int* pa, * pb ,*pc;
pa = &a;
pb = &b;
pc = &c;
printf("pa = %d , pb = %d, pc = %d\n", *pa, *pb, *pc);
exe1(pa, pb, pc);
printf("pa = %d , pb = %d, pc = %d\n", *pa, *pb, *pc);
return 0;
void swap(int* x, int* y)
int temp = *x;
*x = *y;
*y = *x;
int exe1(int* num1Ptr, int* num2Ptr, int* num3Ptr)
if (*num2Ptr > *num1Ptr)
swap(*num1Ptr, *num2Ptr);
if (*num3Ptr > *num2Ptr)
swap(*num3Ptr, *num2Ptr);
if (*num3Ptr > *num1Ptr)
swap(*num3Ptr, *num1Ptr);
【问题讨论】:
您对 swap 的调用应该传递 num1Ptr 而不是 *num1Ptr 等。您的编译器应该对此发出警告。 你的swap函数从来没有使用temp
,很可疑。
传递 'swap' 的参数 1 使指针从整数而不进行强制转换
swap(*num1Ptr, *num2Ptr);
--> swap(num1Ptr, num2Ptr);
*y = *x;
--> *y = tmp;
【参考方案1】:
您的 swap
例程需要两个指向 int
的指针,并且您将两个 int
s 传递给它。从调用中删除多余的星号:
swap(*num1Ptr, *num2Ptr);
应该阅读
swap(num1Ptr, num2Ptr);
加上Kaitou在the answer中指出的swap()
内部的错误。
【讨论】:
【参考方案2】:“读取访问冲突” 在我们尝试访问我们无权访问的内存地址时发生。在这种情况下是因为swap(*num1Ptr, *num2Ptr);
这个函数需要一个指针(与内存地址相关),应该被称为swap(num1Ptr, num2Ptr);
*num1Ptr
取消引用指针,它现在是一个整数值,而不是指向有效地址的指针。例如*num1Ptr
可以是上面代码中的123
。内存地址123
上的任何内容都可能被系统使用,我们没有对其的读/写访问权限。调试器抛出访问冲突。
编译器还应该打印警告。
如前所述,swap 函数需要修复 *y = temp;
。
与您的问题无关,exe1
按此顺序比较值
p1 & p2
p2 & p3
p1 & p3
如果这是一个排序函数,例如,第三个条件可以否定第一个条件。您可能需要更改比较顺序,如下所示:
void swap(int* x, int* y)
int temp = *x;
*x = *y;
*y = temp;
void exe1(int* p1, int* p2, int* p3)
if (*p1 < *p2) swap(p1, p2);
if (*p1 < *p3) swap(p1, p3);
if (*p2 < *p3) swap(p2, p3);
int main()
int a, b, c;
a = 123, b = 456, c = 4;
exe1(&a, &b, &c); printf("%d, %d, %d\n", a, b, c);
a = 123, b = 456, c = 4000;
exe1(&a, &b, &c); printf("%d, %d, %d\n", a, b, c);
return 0;
【讨论】:
【参考方案3】:void swap(int* x, int* y)
int temp = *x;
*x = *y;
*y = *x; // this should be *y = temp;
【讨论】:
以上是关于C 读取访问冲突 - 指针的主要内容,如果未能解决你的问题,请参考以下文章
C++ 读取访问冲突。 _Val 为 nullptr [关闭]