![](/img/trans.png)
[英]What happens when you cast a char * address to int * in C when the address is not word-aligned?
[英]What happens when a int list is cast as a char list in C?
在下面的示例中,我嘗試將 ASCII 整數值列表(表示“a、b、c”)從整數列表轉換為字符列表:
int main() {
int myList[3] = {97, 98, 99}; // a, b, c in ASCII
char * myCharList = (char*) myList;
printf("%c\n", myCharList[0]);
printf("%c\n", myCharList[1]);
printf("%ld\n", strlen(myCharList));
return 0;
}
輸出:
a
1
為什么轉換 int 列表會創建一個長度僅為 1 的字符列表?
編輯:
我想我現在開始明白了。 再舉一個例子,如果我像這樣更改代碼:
#include <stdio.h>
#include <string.h>
int main() {
int myList[3] = {255 + 101, 98, 99};
char * myCharList = (char*) myList;
printf("%c\n", myCharList[0]);
printf("%c\n", myCharList[1]);
printf("%ld\n", strlen(myCharList));
return 0;
}
那么字節將是 100, 255, 0, 0. 然后輸出將是:
d
2
並且因為一個整數是兩個字節,這個指針不能是一個長度超過 2 的列表。
您沒有將整數列表轉換為字符列表。
myList
是一個int
數組。 但是,當在大多數表達式1 中使用數組時,它會被轉換為指向其第一個元素的指針。
所以(char*) myList
將指向myList[0]
的指針轉換為指向char
的指針。 不執行列表轉換; 只有指針被轉換。
結果是myCharList
指向內存中myList
的字節。
在您的系統中, int
值首先以最低有效字節存儲。 很可能,它們有四個字節,因此表示int
97 的字節是 0、0、0 和 97,按從最重要到最不重要的順序。 所以內存中的字節,從低地址到高地址,是97、0、0、0。
當您將strlen
應用於此時,它會看到 97 字節,然后會看到一個零字節,它標志着字符串的結尾。 所以strlen
報告這個“字符串”在內存中的長度是 1。
要將整數列表轉換為包含這些整數的數字的字符串列表,例如將 97 轉換為“97”,您必須使用像sprintf
這樣的例程(它可以像printf
一樣格式化數字,但將結果寫入字符數組而不是到標准輸出)或編寫其他源代碼來執行轉換。 並且您必須通過定義足夠大的數組來保存結果或使用malloc
分配空間來為字符將被寫入的位置提供內存。
1當它不是sizeof
或一元&
的操作數並且不是用於初始化數組的字符串文字時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.