[英]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.