gpt4 book ai didi

c - 使用指向 int 的指针声明字符串

转载 作者:行者123 更新时间:2023-11-30 18:20:04 24 4
gpt4 key购买 nike

我正在尝试使用指向 int 的指针初始化字符串

#include <stdio.h>
int main()
{
int *ptr = "AAAA";
printf("%d\n",ptr[0]);
return 0;
}

此代码的结果是1094795585
任何人都可以解释这种行为以及为什么代码给出这个答案吗?

最佳答案

I am trying to initialize a string using pointer to int

字符串文字 "AAAA" 的类型为 char[5],即由 5 个 char 类型元素组成的数组.

当您分配时:

int *ptr = "AAAA";

您实际上必须使用显式强制转换(因为类型不匹配):

int *ptr = (int *) "AAAA";

但是,它仍然可能无效,因为 intchar 对象可能具有不同的对齐要求。换句话说:

alignof(char) != alignof(int)

可能会成立。另外,在这一行中:

printf("%d\n", ptr[0]);

您正在调用未定义的行为(因此如果编译器喜欢的话,它可能会打印“Hello from Mars”),如ptr[0]取消引用ptr,从而违反严格的别名规则

请注意,进行转换 int * ---> char * 并将对象读取为 char * 是有效的,但反之则不然。

<小时/>

the result of this code is 1094795585

结果是有道理的,但为此,您需要以有效的形式重写您的程序。它可能看起来像:

#include <stdio.h>
#include <string.h>

union StringInt {
char s[sizeof("AAAA")];
int n[1];
};

int main(void)
{
union StringInt si;
strcpy(si.s, "AAAA");

printf("%d\n", si.n[0]);

return 0;
}

要破译它,您需要根据您的实现做出一些假设。例如,如果

  • int 类型占用四个字节(即 sizeof(int) == 4)
  • CPU 具有小端字节顺序(尽管这并不重要,因为每个字母都是相同的)
  • 默认字符集为 ASCII(字母'A'表示为0x41,即十进制的65)
  • 实现使用有符号整数的二进制补码表示

然后,您可以推断出,si.n[0] 保存在内存中:

0x41 0x41 0x41 0x41

这是二进制的:

01000001 ...

符号(最高有效)位未设置,因此它等于:

65 * 2^24 + 65 * 2^16 + 65 * 2^8 + 65 =

65 * (2^24 + 2^16 + 2^8 + 1) = 65 * 16843009 = 1094795585

关于c - 使用指向 int 的指针声明字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31850969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com