【问题标题】:Segmentation fault when outputting a char** [closed]输出字符时出现分段错误** [关闭]
【发布时间】:2020-02-23 07:03:46
【问题描述】:

这是对How to output a char**的跟进。

使用代码:

char** foo = magic() // Pretend magic() is a function that returns a char**

for (char** ptr = foo; ptr != NULL; ptr++)
  {
    std::cout << *ptr << "\n";
    std::cout << ptr << "\n\n";
  }

我遇到了分段错误。我正在尝试打印出 char** 的每个元素。更多细节在我正在跟进的问题中。

这是我从valgrind --leak-check=yes 得到的输出:

==10274== Thread 1:
==10274== Invalid read of size 8
==10274==    at 0x88DF010: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8A436A8: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8A47DB7: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88DA1D0: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8727045: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x882EDFD: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x891D7E1: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88284AE: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88299FA: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x882A6C9: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0xBF2FCF4: WTF::RunLoop::performWork() (in /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.13.7)
==10274==    by 0xBF7BF68: ??? (in /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.13.7)
==10274==  Address 0x38 is not stack'd, malloc'd or (recently) free'd
==10274== 
==10274== 
==10274== Process terminating with default action of signal 11 (SIGSEGV)
==10274==  Access not within mapped region at address 0x38
==10274==    at 0x88DF010: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8A436A8: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8A47DB7: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88DA1D0: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x8727045: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x882EDFD: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x891D7E1: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88284AE: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x88299FA: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0x882A6C9: ??? (in /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.37.6)
==10274==    by 0xBF2FCF4: WTF::RunLoop::performWork() (in /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.13.7)
==10274==    by 0xBF7BF68: ??? (in /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.13.7)
==10274==  If you believe this happened as a result of a stack
==10274==  overflow in your program's main thread (unlikely but
==10274==  possible), you can try to increase the size of the
==10274==  main thread stack using the --main-stacksize= flag.
==10274==  The main thread stack size used in this run was 8388608.
==10274== 

我该如何解决这个问题?

【问题讨论】:

  • foo 指向什么?
  • 现在是您学习如何使用调试器一次运行程序、检查所有变量的值以及观察程序的逻辑执行流程的绝佳机会。这看起来像一个非常简单的错误,您应该可以在调试器中自行解决。这就是调试器的用途。学习如何有效地使用调试器是每个 C++ 开发人员必备的技能。
  • @Beta 它指向一个字符** 更多细节在之前链接的问题中。具体来说就是来自WebKit2GTK+的jsc_value_object_enumerate_properties()的返回值
  • char** ptr = foo; ptr != NULL; ptr++ 应该是 char** ptr = foo; *ptr != NULL; ptr++ 。注意条件测试中应用的去参考。这是假设magic()返回一个指向char*序列的指针,其中序列的结尾由一个空char*分隔(所以它会出现,但这是一个疯狂的猜测,因为没有' t 任何超出破坏代码的证据来支持该假设)。仅供参考,您真的应该在开始之前检查foo 的值。
  • @WhozCraig 我做所有这些都是为了弄清楚 foo 的值,我会阅读更多关于指针的指针,谢谢

标签: c++ pointers memory segmentation-fault char


【解决方案1】:

@WhozCraig 在评论中回答了这个问题:

char** ptr = foo; ptr != NULL; ptr++ 应该是 char** ptr = foo; *ptr != NULL; ptr++ 。请注意条件测试中应用的取消参考。

我需要检查值是否为空,而不是位置。

【讨论】:

    【解决方案2】:

    唯一合乎逻辑的解释是你的魔法函数中的 char** 数组不会以 NULL 终止。

    【讨论】:

    • 不,实际问题是ptr != NULL比较,见cmets。
    • 啊,是的。没注意到那个细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2015-01-03
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多