gpt4 book ai didi

C 指针和访问冲突读取位置

转载 作者:行者123 更新时间:2023-11-30 15:22:29 25 4
gpt4 key购买 nike

我是 C 新手,仍在学习指针。当我在使用 printf 时遇到访问冲突读取位置错误时,我只是通过尝试模拟附加到数组来测试我对指针的理解。这是代码:

#include <stdio.h>
#include <stdlib.h>

int arraySize(int *arrayToSize);

void changeAll(int ***a1PtrPtrPtr, int nToAdd){
int *bPtr = (int *)malloc((arraySize(**a1PtrPtrPtr) + 1) * sizeof(int));
int i = 0;
while (*(**a1PtrPtrPtr + i) != -1){
bPtr[i] = *(**a1PtrPtrPtr + i);
i++;
}
bPtr[i] = nToAdd; i++;
bPtr[i] = -1;

*a1PtrPtrPtr = &bPtr;
}

int main(void){
int a[4] = { 1, 2, 3, -1 };
int *aPtr = a;
int **aPtrPtr = &aPtr;
int ***aPtrPtrPtr = &aPtrPtr;
int n = 4;

changeAll(aPtrPtrPtr, n);

int counter = 0;
while (counter < 5){
int temp = *(*aPtrPtr + counter);
printf("%d is %d", counter, temp );
counter++;
}

return 0;
}

int arraySize(int *arrayToSize){
int sizeTemp = 0;
int i = 0;
while (arrayToSize[i] != -1){
sizeTemp++;
i++;
}
sizeTemp++;
return sizeTemp;
}

当 counter = 1 时,我第二次在 main() 的 while 循环中打印时收到错误。我不明白的是,如果我注释掉该 printf 语句并查看我的中的 temp 值IDE (MVSE 2013) 它正是我想要和预期的,即 temp 将是 1 然后 2,3,4,-1。

请问发生了什么事,提前感谢您的帮助。

最佳答案

首先,如果您想知道这似乎有时是如何工作的,您确实应该 read this stellar answer另一个有些相关的问题。

简而言之,您从函数内部将地址保存到自动变量,然后将所述地址视为在函数返回后仍然有效。自动变量是引用动态数据的指针是无关紧要的。一旦函数过期,变量本身就不再有效,因此取消引用其使用地址会调用未定义的行为:

void changeAll(int ***a1PtrPtrPtr, int nToAdd)
{
// NOTE: local variable here
int *bPtr = (int *)malloc((arraySize(**a1PtrPtrPtr) + 1) * sizeof(int));
int i = 0;
while (*(**a1PtrPtrPtr + i) != -1){
bPtr[i] = *(**a1PtrPtrPtr + i);
i++;
}
bPtr[i] = nToAdd; i++;
bPtr[i] = -1;

// NOTE: saving address of local variable here
*a1PtrPtrPtr = &bPtr;
}

根据如何设置,最快的修复方法就是这样:

**a1PtrPtrPtr = bPtr;

而不是你拥有的。这会将动态分配结果保存到正确的位置(最终是 main() 中的 aPtr 中保存的地址)。它看起来很丑陋(坦率地说,确实如此),但它会起作用。

祝你好运。

关于C 指针和访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29203138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com