【发布时间】: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