从 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

一行中有两个未定义的行为。

  1. 当您取消引用 int * 指针时,您在 k 对象之外读取了非法内容。
  2. 即使 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

我希望这个答案对您有所帮助,我愿意接受反馈以改进它。