您现在的位置是:主页 > news > 建设网站网站名/aso优化什么意思

建设网站网站名/aso优化什么意思

admin2025/5/23 18:50:06news

简介建设网站网站名,aso优化什么意思,重庆轨道交通最新消息,可以免费建网站的野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用…

建设网站网站名,aso优化什么意思,重庆轨道交通最新消息,可以免费建网站的野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用…

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。(定义来自百度百科)

#include <stdio.h>#define PTR_NULL    ( (void*)0 )
typedef unsigned int uint32;static void TestOutput( const uint32 * PtrData)
{if( PTR_NULL != PtrData ){printf("the data = %x n", *PtrData);} 
}int main()
{uint32* Test ;*Test = 0x12345678;TestOutput(Test);
}

该测试程序虽然输出正确的结果,但不代表该程序没问题。实际上指针变量Test是个野指针。

1. 申明一个变量且在其生命周期内,就会在RAM中分配一块内存区域供其使用。

unsigned int b = 3000表示在RAM中分配4 Bytes(假设该类型变量在目标系统中占32bits)内存区域用来存储unsigned int类型数据。

b70c4dbd9476896c3b9defa32a8f8cbf.png

系统在RAM中分配连续四个字节的内存区域且起始地址为0x20000000,该RAM区域存储3000。变量b的地址,即&b为0x20000000。

unsigned int * c = 0x21000000表示在RAM中分配4 Bytes内存区域用来存储一个地址(指针),而这个地址为另一RAM区域的首地址,该内存区域存放着unsigned int类型的数据。

cf45cb4d794d0efe15c378a2a53614a5.png

系统在RAM中分配连续四个字节的内存区域且起始地址为0x20000000,该RAM区域存储0x21000000。0x21000000中存放着unsigned int类型数据。变量c的地址,即&c为0x20000000。

2. 内存区域中的数据为随机值

unsigned int * c = 0x21000000。变量c申明的时候即赋初值。所以0x20000000-0x20000003内存区域内的数据为固定值即0x21000000。如果不赋初值,则该内存区域中的数据为随机值。

3. 每个变量的内存区域都由系统统一分配管理

unsigned int a = 1;unsigned int b = 2;unsigned int *c;

a95546e213010ea0e74be69b6208152f.png

系统为变量a分配了起始地址为0x20000000的内存区域;为变量b分配了起始地址为0x20000004的内存区域;为指针变量c分配了内存区域为0x20000008的内存区域,但未对指针变量c赋初值所以变量c所在的内存区域内的数据为随机数,也就是c所指向的位置是不可预知的。如果该随机数正好为0x20000000,即c为0x20000000。当我们对指针c进行操作

*c = 3;

变量a的值就由1变成3,这是我们需要绝对避免的错误。

实际上即使我们对变量c赋初值,unsigned int *c = 0x10000000。这种做法也无法避免错误,因为无法确认系统是否已经将起始地址0x10000000对应的内存区域分配给其他变量。

unsigned int a = 1;
unsigned int b = 2;
unsigned int *C =&b;

这样我们就能确保c指向的位置是固定的。

聊一聊C语言的野指针​mp.weixin.qq.com

a2c8f16b4d41a2f1bee644323a6c748f.png