【问题标题】:how could the const char * changed?const char * 怎么可能改变?
【发布时间】:2012-06-09 01:17:02
【问题描述】:

我正在编写一个可以递归打印目录的程序, 下面是gdb调试段

注意 d_path(它是一个 const char * 作为参数传递给 print_dir_tree) 在步骤到“if (dr == NULL) {”之前是“/home/cifer/.gftp” 但是,它在此子句之后打印为“/home/cifer/!\200”

谁能告诉我为什么? 非常感谢!

Breakpoint 1, print_dir_tree (d_path=0x805b058 "/home/cifer/.gftp", depth=4)

    at dir_demo.c:15

15      DIR *dr = opendir(d_path);

(gdb) print d_path

$2 = 0x805b058 "/home/cifer/.gftp"

(gdb) print d_path

$3 = 0x805b058 "/home/cifer/.gftp"

(gdb) step

16      if (dr == NULL) {

(gdb) print d_path

$4 = 0x805b058 "/home/cifer/!\200"

(gdb) step

20      struct dirent *de = NULL;

(gdb) print d_path

$5 = 0x805b058 "/home/cifer/!\200"

(gdb) step

21      while((de = readdir(dr)) != NULL) {

(gdb) print d_path

$6 = 0x805b058 "/home/cifer/!\200"

(gdb) 

【问题讨论】:

  • 不看代码很难说;可能依赖于未定义的行为,可能是某处的缓冲区溢出。你应该创建一个minimal test-case
  • 是否还有其他线程 - 它们在调试期间被禁用了吗?忙调试时清理dr的内存有没有超时?你能用一个非常简单的程序来复制吗?
  • 现在我粘贴整个代码......

标签: char gdb constants


【解决方案1】:

我需要查看您的代码才能确定,但​​如果您询问是否可以更改 const,答案是肯定的。如果您要问如何更改它,那很简单,它被视为常规变量,但它会在更改时向您发出警告。如果您尝试更改它并避免出现警告,您可以复制该变量,然后对其进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多