C语言 指针_野指针 指针运算

时间:2025-01-23 17:19:15

野指针:

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

指针非法访问:

int main()
{

	int* p;
	//p没有初始化,就意味着没有明确的指向
	//一个局部变量不初始化,放的是随机值:0xcccccccc
	//
	*p = 10;//非法访问内存了


	return 0;
}

指针越界访问:

int main()
{

	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		//当指针指向的范围超出数组arr的范围时,p就是野指针
		*(p++) = i;
	}
	return 0;
}

指针指向的空间释放:

int* test(void)
{
	int a = 0;
	return &a;
}


int main()
{
	int* pi = test();//这个时候pi属于野指针


	return 0;
}

如何避免野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放即使置NULL

4.避免返回局部变量的地址

5.指针使用之前检查有效性

int main()
{

	//int* pi = NULL;
	//*pi = 100;//err

	int* pi = NULL;//指针初始化 NULL -> 0
	if (pi != NULL)
	{
		*pi = 100;//ok
	}
	return 0;
}

指针运算

指针+-整数

#define N_VALUES 5
int main()
{

	float values[N_VALUES];
	float* vp;
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;
	}

	return 0;
}

另一种写法

int* p = arr;
	for (i = 0; i < sz; i++)
	{
		*(p + i) = 1;
	}

指针-指针

指针-指针(绝对值)得到的是指针和指针之间的元素的个数

不是所有的指针都能相减,指向同一块空间的指针才能相减(有意义)