C语言 指针程序中的运行时错误


#include<stdio.h>
main(){
int b=90;
int*  a;
a=&b;
//pointer arith metic
printf("Address a is %dn",a);
printf("size of integer is %d bytesn",sizeof(int));
printf("Address a is %dn",*a);
printf("Address a+1 is %dn",a+1);
printf("value  of a+1 is %dn",*(a+1));
char *ip;
ip=(char*)&b;
printf("Address ip is %dn",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 的地址的输出 指针转换为字符变得相等3.虽然指针值转换为字符,但它显示变量的完整值

ip=(char*)&b;
printf("Address ip is %dn",*ip);

输出:地址 ip 为 90

这个:

a + 1

a具有类型时int *将打印地址递增一int的大小。这被称为指针算法,是 C 在指针方面最核心的功能之一。

1.A+1位置的地址之间总是有4个字节的间隔

间隙字节由指针类型确定:字符指针-->间隙字节为1字节,int指针-->间隙字节为4字节...

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

==>地址 (a+1( 和 (a( 的偏移量为 4 字节 (1495857872 - 1495857868 = 4(

  1. 当指针转换为字符时,值 *(a+1( 处的值和变量 b 的地址相等

地址(a+1(处的值不能是前提的,它基于您的系统。

  1. 我在电脑中运行,结果是:

    地址 b 是:2665524

    A+1 的值为:2665720

  2. 如果稍微更改代码,Add (a+1( = 5;之前://指针算术 metic*

然后运行 -->结果变为:

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

3.虽然指针值转换为字符,但它显示变量的完整值

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

如果您将 b 分配> 255,例如:int b=290;

然后运行 -->结果变为:

Value a is:         290
value ip is:        34

你可以改变:

printf("Address a is %dn",a);

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

直到

printf("Address a+1 is %dn",a+1);

你的代码应该没问题。但是下一句话是有问题的

printf("value  of a+1 is %dn",*(a+1));

由于a是一个指针a+1它将按系统中int占用的字节数向a前进。然后,通过执行 *(a+1(,您正在尝试访问未为 a 分配的内存位置(请记住,a 仅用于在执行 a=&b; 时存储一个整数的地址(。

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

3.虽然指针值转换为字符,但它显示变量的完整值

ip=(char*)&b;

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

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

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

假设您将 printf 更改为 :

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

你应该得到

Value pointed to by ip is Z

这里90被解释为对应于字母 Z 的 ASCII 码。

相关内容

最新更新