gpt4 book ai didi

c - 通过指针传递对象时成员值丢失

转载 作者:行者123 更新时间:2023-11-30 16:14:31 26 4
gpt4 key购买 nike

我对 FreeBSD 世界非常陌生,目前正在将我的终端仿真库从 Linux 移植到 FreeBSD 和 Mac OS。我遇到了一些非常奇怪的行为,例如当我通过指针传递结构到子例程时,成员值会被清零。在 Linux 或 Mac OS 上不会发生这种情况。编译器是 GCC 还是 Clang 也并不重要。

在调用子例程以及通过指针传递父结构体之前,我已确认成员值是正确的。

我在 Linux 和 Mac OS 上测试了相同的代码,它们没有出现问题。

我在 FreeBSD 上切换了 GCC 和 Clang,但似乎没有效果。

我认为堆栈粉碎可能会发生,但这似乎不太可能,因为 ulimit 显示 Linux 上的堆栈大小为 8M,但在 FreeBSD 上它要大得多(524 MB)。我也尝试过使用 -fstack-protector-strong 进行编译,但这都不重要。

#include "vterm.h" 
#include "vterm_private" // vterm_t and vterm_desc_t defined here

void vterm_cursor_move_backward(vterm_t* vterm) {
vterm_desc_t* v_desc = NULL;
int min_row;
int idx;

// idx = vterm_buffer_get_active(vterm);
idx = 0; // hard set to 0 just for debugging
v_desc = &vterm->vterm_desc[idx];

// printf() will display a value of zero
printf("%d\n\r", v_desc->ccol);
fflush(stdout);
}

void vterm_interpret_ctrl_char(vterm_t* vterm, const char* data) {
vterm_desc_t *v_desc = NULL;
int idx;
char verb;

// idx = vterm_buffer_get_active(vterm);
idx = 0; // hard set to 0 just for debugging
v_desc = &vterm->vterm_desc[idx];

verb = data[0];

switch (verb) {
case '\b': {
// the following printf will print a positive number
printf("%d\n\r", v_desc->ccol);
fflush(stdout);
vterm_cursor_move_backward(vterm);
break;
}
}
}

我希望两个函数中 v_desc->ccol 的值相同。 Godbolt Link Github Link请参阅文件 vterm_ctrl_char.c 和 vterm_cursor.c

最佳答案

经过无数个小时的调试,我发现 vterm_desc_t 结构中的数据实际上被移动,导致成员值设置为零。尽管 ncurses 头文件是通过 vterm_private.h 包含的,但在 FreeBSD 上这似乎并不重要。 GCC 和 Clang 都很乐意以错误/不完整的对齐方式静默编译 vterm_cursor.c 翻译单元。

我建议任何遇到问题的人尝试单独编译每个翻译单元,这就是我发现它的方法。例如gcc -S vterm_cursor.c

感谢所有看过此内容的人。

关于c - 通过指针传递对象时成员值丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614610/

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