簡體   English   中英

為什么在char **強制轉換后出現細分錯誤?

[英]Why do I get a segmentation fault after char** cast?

我正在嘗試做這樣的事情:

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]會導致分段錯誤?

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' 0x54 0x53 0x52 0x49 0x46 'T' 'S' 'R' 'I' 'F' ,這表明了問題(字符顛倒了,因為我假設一個小端序平台)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM