【问题标题】:int pointer typecasted with char pointer throw unexpected output?用 char 指针类型转换的 int 指针会抛出意外的输出?
【发布时间】:2014-09-19 17:08:40
【问题描述】:

使用 char 指针转换的 Hello int 指针类型会抛出意外输出? 以下是我的代码,请帮助我理解

 #include<stdio.h>
 int main()
{     
  int arr[3]={2,3,4};
  char*p;
  p=(char*)arr;
  printf("%d\n",*p); // here 2 its good 
  p=p+8;
  printf("%d\n",*p);//here 4 why not 1?
 }

【问题讨论】:

  • no...不考虑错别字,应该是4。
  • 应该是int arr[3] = {2,3,4}; 吗?您的示例中没有int*
  • 位不是字节。字符是 1 个字节长,而不是 8 个字节长。 arr+8 在数组之外,因此可以打印任何内容或崩溃。
  • p=p+8 指向保存整数值 3 的内存地址 -- 仅当 ints 的长度为 8 个字节时。 即第 1 位 1 和第 2 位 2 所以 p=p+8 表示内存的第一位 -- 不,位没有单独的地址,字节有。

标签: c pointers gcc


【解决方案1】:

您的代码会导致未定义的行为。首先,我假设你的意思是:

 char arr[3] = {2,3,4};

而不是你那里有什么。那么是的,您的第一个打印语句是正确的,并且将输出 2。但是,第二个打印语句可能会发生任何事情。您有一个 3 字节长的数组,现在您指向其起始地址之后的 8 个字节。 任何东西都可能在那里,所以你的打印可以显示任何输出。

如果你有的话:

int arr[3] = {2,3,4};

您的第二个输出将显示40,这取决于您分别使用的是小端系统还是大端系统。假设你有一个 4 字节的 int 类型,那就是。

【讨论】:

  • 我们假设它是 little endian 那么为什么 4 请解释一下?
  • @carrercarrer 为什么不呢? (int)2 是 4 个字节长,所以在 3 上加上 p+4 个点。 (int)3 是 4 个字节长,所以 p +8 分到 4。这很明显......不明显的是你为什么不这么认为。
【解决方案2】:

我想你是这个意思:

char arr[3] = {2,3,4};

现在,p 是一个 char 类型的指针,当你将它增加 8 时,它指向了一些无效的 位于 char 数组之外的内存位置(因为您已为 3
arr) 中的成员,其中很可能包含垃圾。
在这种情况下,输出是不可预测的,因为它可能是垃圾,或者你可能会得到一个有效的
价值。

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 2020-12-28
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多