我想做这样的事:

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

最佳答案

Achar[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平台)。

10-08 03:55