gpt4 book ai didi

c - Xcode C 调试在单步执行时更改指针的值

转载 作者:行者123 更新时间:2023-12-02 15:51:22 24 4
gpt4 key购买 nike

我正在调试 C 代码,其中的指针内有一个指向名为 board 的结构的指针。我有一个打印电路板的功能:

static void board_print(board *b){
int i,j;
char data;
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
data = b->data[i * size + j];
if(data){
printf("X ");
}else{
printf("O ");
}
}
printf("\n");
}
}

这是奇怪的部分。当我在第一个 for 循环开始时最初触及断点时,一切正常,我的数据正确,所有指针都工作等,如下所示:

first

然后,我第一次进入循环,i 和 j 等于 0,并且 b->data[0] 应该完全有效,因为它是两步前的。突然,当我踩到 data = b->data[i * size + j]; 行时,数据指针变成了空指针。当我执行该行时,我(显然)收到错误的访问错误,如下所示:

second

可能是什么原因?我以前使用过 C,并且已经很好地掌握了它,但在单线程简单 C 程序中,我从未见过指针值突然变为 null。我使用 Apple LLVM Compiler 4.1 进行编译,使用 lldb 进行调试,这是 XCode 4.5 的默认设置。

更新:与使用 gcc 编译和使用 gdb 调试观察到的行为相同。我这边几乎百分百出错,但我不知道代码出了什么问题..

更新#2:我现在注意到 gcc/gdb 上有一些更奇怪的东西。就在执行 data = b->data[i * size + j]; 行之前,我可以毫无问题地从调试器访问所有内容。执行该行后,我无法完全访问 b->data,包括我在单步执行之前访问的值:

third

在调试器中成功执行 $4 = ... 行之后,我已经跨过了该行。然后我遇到了各种寻址错误,如上所示。我真的不知道发生了什么......

更新#3:我注意到一些非常奇怪的事情。在这里,首先看看我已经实现的修复。当我完全摆脱名为 data 的变量时,这个开始工作没有问题:

fourth

现在,请仔细查看我通过更新 #2 上传的屏幕截图:在我为名为 data本地变量分配一个值之后,还b->data 更改其地址。它看起来像是作业的副作用。但我不知道这背后的原因是什么。

最佳答案

显然,某事/某人更改了董事会结构的“数据”属性。

为什么?我只能看到 3 个原因:

  • 您的应用程序是多线程的,另一个线程将数据指针更新为 NULL(这不是您的情况,您只使用一个线程,抱歉没有注意到)。

  • 板结构是从堆栈中分配的,但内容不再有效...例如:返回局部变量的指针,但变量(结构)被销毁(因为这是返回指针时的局部变量...

  • 板结构从堆中分配然后释放,最后这个释放的指针仍然被使用:堆内存被其他东西损坏了......

我的猜测:第二点是经常犯的错误

一个简单的问题:板结构存储在 HEAP 或 STACK 内存中?

关于c - Xcode C 调试在单步执行时更改指针的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083284/

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