从 char* 到 int* 的类型转换
Type casting from char* to int*
我在学校学习 c,对如何使用类型转换有点困惑。
这是我的代码。
我想弄清楚什么是类型转换以及它是如何工作的。
我初始化了一个指向k地址的指针(ptr3),然后初始化了ptr4并赋值了ptr3,然后转换成int*。
但这似乎不起作用,因为它每次都会给出随机值。
为什么?
感谢任何反馈!非常感谢。
#include <stdio.h>
int main() {
char k = 10;
char* ptr3 = &k;
int* ptr4 = (int*) ptr3;
printf("*ptr3 = %d *ptr4 = %d\n", *ptr3, *ptr4);
return 0;
}
输出是
*ptr3 = 10 *ptr4 = 1669824522
一行中有两个未定义的行为。
- 当您取消引用
int *
指针时,您在 k
对象之外读取了非法内容。
- 即使
k
有足够的大小(例如是一个字符数组),将数据用作另一种类型也违反了严格的别名规则 - 这也是 UB
一般来说,除非您真的知道自己在做什么,否则不要对指针进行类型转换。如果要将字节数组转换为整数,请使用 memcpy
functionh.
一个char
是1个字节,但是一个整数是4个字节。
你在做什么叫做类型双关,你告诉编译器不要将你的 char
转换为 int
并直接从相同的内存地址读取 4 个字节,而你只是分配 1 个字节。其他 3 个字节可以是任何东西。
char 的字节如下所示:
10
很简单,只有一个号。整数比 char 需要多 3 个字节,所以这里是整数在字节中的样子:
10 ? ? ?
解决方法:
#include <stdio.h>
int main()
{
char k = 10;
int i = (int)k;
printf("k = %d i = %d\n", k, i);
return 0;
}
这段代码不是直接读取内存,而是告诉编译器将 char
转换为 int
,用零填充进程中的这 3 个随机字节。这是变量 i
在内存中的样子:
10 0 0 0
最后3个字节用0填充,整数为10
我希望这个答案对您有所帮助,我愿意接受反馈以改进它。
我在学校学习 c,对如何使用类型转换有点困惑。 这是我的代码。
我想弄清楚什么是类型转换以及它是如何工作的。
我初始化了一个指向k地址的指针(ptr3),然后初始化了ptr4并赋值了ptr3,然后转换成int*。
但这似乎不起作用,因为它每次都会给出随机值。
为什么?
感谢任何反馈!非常感谢。
#include <stdio.h>
int main() {
char k = 10;
char* ptr3 = &k;
int* ptr4 = (int*) ptr3;
printf("*ptr3 = %d *ptr4 = %d\n", *ptr3, *ptr4);
return 0;
}
输出是
*ptr3 = 10 *ptr4 = 1669824522
一行中有两个未定义的行为。
- 当您取消引用
int *
指针时,您在k
对象之外读取了非法内容。 - 即使
k
有足够的大小(例如是一个字符数组),将数据用作另一种类型也违反了严格的别名规则 - 这也是 UB
一般来说,除非您真的知道自己在做什么,否则不要对指针进行类型转换。如果要将字节数组转换为整数,请使用 memcpy
functionh.
一个char
是1个字节,但是一个整数是4个字节。
你在做什么叫做类型双关,你告诉编译器不要将你的 char
转换为 int
并直接从相同的内存地址读取 4 个字节,而你只是分配 1 个字节。其他 3 个字节可以是任何东西。
char 的字节如下所示:
10
很简单,只有一个号。整数比 char 需要多 3 个字节,所以这里是整数在字节中的样子:
10 ? ? ?
解决方法:
#include <stdio.h>
int main()
{
char k = 10;
int i = (int)k;
printf("k = %d i = %d\n", k, i);
return 0;
}
这段代码不是直接读取内存,而是告诉编译器将 char
转换为 int
,用零填充进程中的这 3 个随机字节。这是变量 i
在内存中的样子:
10 0 0 0
最后3个字节用0填充,整数为10
我希望这个答案对您有所帮助,我愿意接受反馈以改进它。