为什么在char **强制转换后出现细分错误?

时间:2018-11-27 17:58:11

标签: c string casting fault

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

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]会导致分段错误?

1 个答案:

答案 0 :(得分:2)

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',它显示了问题(字符颠倒了,因为我假设是一个小的endian平台)。