【问题标题】:Why do I get a segmentation fault after char** cast?为什么在 char** cast 后出现分段错误?
【发布时间】:2018-11-27 17:58:10
【问题描述】:

我正在尝试做这样的事情:

int main()
{
    char strMat[][32] = { {"FIRST"}, {"SECOND"}, };
    printf ("%s\n", strMat[0]);
    test ((char **) strMat);
    return 0;
}

void test (char **strMat)
{
    printf ("%s\n", strMat[0]);
}

我无法弄清楚为什么在调用 test() 之前第一个字符串写入正确,但后来我遇到了分段错误。在其他代码部分中,我用 argv 调用 test() 并且它工作正常。为什么尝试在测试函数上打印 strMat[0] 会导致分段错误?

【问题讨论】:

  • 解决这个问题的简单方法是在调试器中运行它,它会告诉你在哪里以及传入了什么
  • 'debigger' - 一个让问题更小的工具 :-)

标签: c string casting fault


【解决方案1】:

char[2][32] 不是char**,而是一个连续的 2*32 字节内存块。这可以通过打印指针来突出显示:

printf("%p %p %p\n", strMat[0], &strMat[0], &strMat[1]);

当您将类型强制为char** 时,您会将数组中包含的数据解释为不可避免地引用无效内存的内存地址。

确实,如果您尝试打印您认为正确的无效地址,例如:

printf("%p\n", ((char**)strMat)[0]);

你得到0x5453524946,它被解释为像0x54 0x53 0x52 0x49 0x46这样的字节数组,产生'T' 'S' 'R' 'I' 'F',这表明了问题(字符被颠倒了,因为我假设一个小端平台)。

【讨论】:

  • 我正在用 C 编程。感谢您的回答!将 strMat[][32] 更改为 *strMat[32] 有效。
  • 哦,对不起,别问我为什么读过 C++ 标签。然后同样的答案适用,但您无权访问static_cast
  • char* strMat[32] 是另一回事,它是一个由 32 个指向 char 的指针组成的数组。你只想要一个char* strMat[]
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多