Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中,当int列表转换为char列表时会发生什么?_C - Fatal编程技术网

在C中,当int列表转换为char列表时会发生什么?

在C中,当int列表转换为char列表时会发生什么?,c,C,在下面的示例中,我尝试将代表a、b、c的ASCII整数值列表从整数列表转换为字符列表: 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]); print

在下面的示例中,我尝试将代表a、b、c的ASCII整数值列表从整数列表转换为字符列表:

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;
}

因为整数是两个字节,所以此指针不能是长度大于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来分配空间,从而为写入字符的位置提供内存

脚注
当它不是sizeof或一元&的操作数且不是用于初始化数组的字符串文字时为1。

答案如下:。以+2票寻找答案。+1请注意,某些架构(如OpenRISC)首先存储最重要位的整数,因此在这些架构上,strlen将返回0,而不会打印任何内容。无论编写什么代码来将int转换为char,都需要考虑到这一点,以便于移植。
d

2