输出字符时出现分段错误**



这是如何输出字符**的后续内容。

使用代码:

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 << "nn";
}

我有一个分割错误。我正试图打印出字符**的每一个元素。更多细节请参阅我正在跟进的问题。

这是我从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== 

我该怎么解决这个问题?

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

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

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

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

最新更新