C语言 指针的值在调用printf后更改

vc6uscn9  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(157)

每次调用printf后,结构指针的值都会发生变化。
我有以下结构体:

struct block_meta_data
{
    size_t size; 
    struct block_meta_data * next; 
    int isFree; 
}; 
typedef struct block_meta_data block_meta_data;

struct list
{
    block_meta_data* base; 
    block_meta_data* end; 
}; 
typedef struct list list;

我定义了一个列表类型的全局变量blocks_list:

list blocks_list = {NULL, NULL};

其主要功能如下所示:

int main(void)
{
    char a[] = "hello"; 
    printf("%s\n", a); 
    return 0;  
}

现在,使用调试器,我在调用printf之前观察'blocks_list'变量的两个字段的值,它们的值都为NULL:

调用printf后,两个字段的值都更改为:

我尝试打印end和base的值(不使用编译器),但问题仍然存在:
一个三个三个一个
有人能解释一下为什么会这样吗?

esyap4oy

esyap4oy1#

有人能解释一下为什么会这样吗?
有几种可能的解释:

  • 您没有告诉我们整个故事(提供MCVE)--这是最有可能的故事
  • 这是一个调试工件--您的调试器感到困惑,并显示了一些实际上没有发生的事情
  • 编译器检测到blocks_list实际上没有被使用,并且没有为它分配任何存储(通常编译器也会将blocks_list的位置设置为0,这将阻止调试器显示它)。

由于您似乎使用的是Linux,请注意,您可以使用GDB观察点 * 告诉 * 值被覆盖的位置:

(gdb) watch -l blocks_list.base
(gdb) continue

# GDB will stop when blocks_list.base changes its value

相关问题