簡體   English   中英

在 C 中將 int 列表轉換為 char 列表時會發生什么?

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

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