指针程序中的运行时错误

时间:2016-04-20 07:14:33

标签: c pointers

#include<stdio.h>
main(){

int b=90;
int*  a;
a=&b;
//pointer arith metic
printf("Address a is %d\n",a);
printf("size of integer is %d bytes\n",sizeof(int));
printf("Address a is %d\n",*a);
printf("Address a+1 is %d\n",a+1);
printf("value  of a+1 is %d\n",*(a+1));

char *ip;
ip=(char*)&b;
printf("Address ip is %d\n",ip);
}

该计划的输出:

Address a is 1495857868
size of integer is 4 bytes
Address a is 90
Address a+1 is 1495857872
value  of a+1 is 1495857868
Address ip is 1495857868
Address ip is 90

1.在a + 1位置和

的地址之间总是有4个字节的间隙

2. *(a + 1)处的值的输出和当时的变量b的地址  指针转换为char变得相等 3.尽管指针值转换为char,但它显示变量的完整值

ip=(char*)&b;
printf("Address ip is %d\n",*ip);

输出:地址ip为90

3 个答案:

答案 0 :(得分:1)

此:

a + 1

a类型为int *时,将打印地址增加一个int的大小。这被称为指针算术,并且是指向C的最核心功能之一。

答案 1 :(得分:1)

  

1.在a + 1位置的地址之间总是有4个字节的间隙

Gap字节由指针类型决定:char指针 - &gt; gap bytes是1个字节,int指针 - &gt;间隙字节是4个字节...

在这种情况下:变量a是int指针 - &gt;间隙字节是4个字节

==&gt;地址偏移量(a + 1)和(a)为4字节(1495857872 - 1495857868 = 4)

  
      
  1. *(a + 1)处的值的输出和指针转换为char时的变量b的地址变得相等
  2.   

地址(a + 1)处的值无法预测,它基于您的系统。

  1. 我在我的电脑上跑,结果是:

    地址b是:2665524

    a + 1的值是:2665720

  2. 如果您稍微更改一下代码,请先添加 (a + 1)= 5; < / em> //指针arith metic *

  3. 然后运行 ​​- &gt;结果成为:

    Address b is:         2665524
    value  of a+1 is:     5
    
      

    3.尽管指针值转换为char,但它显示变量的完整值

    它显示变量的完整值,因为b的值是90,这个值只需要1个字节存储在内存中,所以当它转换为char(内存中的1个字节)时,你看到转换为char后的值等于int value。

    如果你asign b&gt; 255,例如:int b = 290;

    然后运行 ​​- &gt;结果成为:

    Value a is:         290
    value ip is:        34
    

答案 2 :(得分:0)

您可以更改:

printf("Address a is %d\n",a);

printf("Address a is %p\n",a); //%p is specifically designed for pointers.

直到

printf("Address a+1 is %d\n",a+1);

你的代码应该没问题。但下一个陈述是有问题的

printf("value  of a+1 is %d\n",*(a+1));

由于a是指针a+1,因此系统中a占用的字节数int将提前a。然后,通过执行*(a + 1),您尝试访问未分配给的内存位置。(记住a=&b;仅用于存储{{1}时的一个整数的地址})。

当您尝试取消引用您无权使用的内存位置时,根据C标准,行为未定义。

  

3.尽管指针值转换为char,但它显示变量的完整值

ip=(char*)&b;

语句虽然指针值转换为char 是错误的。只是你将地址&b中的内容视为字符。然后你有:

printf("Address ip is %d\n",*ip); 
// Remember you're printing the value not address. So change the print message

请记住,任何数据都存储为位zeroesones,它是您选择的格式说明符,用于确定其显示方式。在这里,您将&b中的内容打印为%dprintf中提到的整数,因此结果为90。幸运的是,数字90足够小,可以包含在一个字节中。

假设您将printf更改为:

printf("Value pointed to by ip is %c\n",*ip); // %d to %c

你应该有

Value pointed to by ip is Z

此处90被解释为ASCII码,对应于字母Z