【问题标题】:Get an int from an array of chars [duplicate]从字符数组中获取一个 int [重复]
【发布时间】:2013-12-09 10:52:05
【问题描述】:

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

char arr[50];

有人告诉我,在 arr[1]arr[4] 之间,我需要得到一个 int

我做到了:

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

return *p;

有人告诉我这是一个错误。为什么?

【问题讨论】:

  • 因为它违反了strict aliasing rule
  • 这里没有详细说明问题。当然 H2CO3 说的是真的,但你的老师可能是指四​​个文本数字,或者可能一直在谈论课堂上的字节序。编辑:我看到你自己放置了对齐标签,你有什么理由不说为什么这里的答案不够好?

标签: c casting alignment


【解决方案1】:

在我的系统上,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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多