c - 从字符数组中获取一个 int

标签 c casting alignment

<分区>

我有一个包含 50 个 char 的数组:

char arr[50];

有人告诉我,在 arr[1]arr[4] 中,有一个 int 我需要获取。

我做到了:

int *p = (int *)(arr+1);

return *p;

我被告知这是一个错误。为什么?

最佳答案

在我的系统上,sizeof(char)=1sizeof(int)=4

问题的根源在于您正在强制转换为指向 int (int *) 的指针,这掩盖了基础类型 char 的真正对齐。假设一个 4 字节的 int,编译器尝试访问 4 个字节而不是 1 个字节。

给定:

char arr[] = "ABCDEFGHI";

然后你的代码产生:

int *p = (int *)(arr+1); /* *p = 1162101570, interpreting "BCDE" as int */

为了利用 C 的自动类型转换,您需要更像这样的东西:

int p = (int)(*(arr+1)); /* p = 66, the ASCII code for 'B' */

或者,根据您对 arr 的原始声明,不那么晦涩,在技术上更正确,

int p = (int)arr[1]; /* p = 66 */

但实际上,这就是您所需要的:

int p = arr[1]; /* p = 66 */

关于c - 从字符数组中获取一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20180768/

相关文章:

c - 指针和排序

c# - 强制转换为无效枚举值 Enum.ToObject,不会引发异常,将 Enum 设置为 int

c++ - 将包含 void 指针的一对转换为一对其他类型的指针

android - OpenCV ORB 特征检测器如何工作?

html - 以 mailchimp 形式居中输入

html - 使一个 div/span 在更大的 div/span 的右侧显示其内容?

比较 int 和 unsigned int

c - OpenGL glBegin 和 glPushMatrix

arrays - DirectCast(或替代方案)将类型数组中的值作为第二个参数?

C - Valgrind 和 "Conditional jump or move depends on uninitialised value(s)"错误