C++知识点——NULL和nullptr,野指针

C++知识点——NULL和nullptr,野指针,第1张

文章目录
      • 1NULL和nullptr
      • 2 野指针

1NULL和nullptr

1 参考 :https://blog.csdn.net/reasonyuanrobot/article/details/100022574?spm=1001.2101.3001.6661.1

2 补充:nullptr是一个字面值常量,类型为std::nullptr_t,空指针常数可以转换为任意类型的指针类型。

3 demo:

#include
using namespace std;

void show(int)
{
	cout << "int" << endl;
}

void show(int* p)
{
	cout << "int*" << endl;
}

int main()
{
	int *p = NULL;
	int *p1 = nullptr;
	show(NULL);		//int
	show(nullptr);	//int*
	show(p);		//int*,这里p定义为*p了 
	return 0;
}
2 野指针

1 参考:https://blog.csdn.net/l477918269/article/details/89949858?spm=1001.2101.3001.6661.1

2 概念:指针指向了一块随机的空间,不受程序控制。

3 产生原因以及解决方法:
1 指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量默认值是随机的:

-----错误
int *p;
*p = 10;
-----解决方法
int *p=nullptr;

所以,指针变量在创建的同时应当被初始化,要么将指针设置为nullptr,要么让它指向合法的内存

2 指针被释放时没有置空:我们在用malloc或new开辟空间的时候,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free或delete释放后,如果程序员没有对其进行置空或者其他赋值 *** 作的话,就会成为一个野指针。

#include
using namespace std;

void showchar(unsigned char* str, int len)
{
	for (int i = 0; i < len; i++){
		cout << str[i];
	}
	cout << endl;
}

int main()
{
	unsigned char str[] = "hello sea";
	unsigned char*p = (unsigned char *)calloc(10, 1);

	if (p != NULL)  //判断动态分配是否成功,失败则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败
	{
		memcpy(p, str, 10);
		showchar(p, 10);  //hello sea
	}
	free(p);  //释放了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身
	p = nullptr;  //将指针变为空指针否则会变为野指针,指向的空间被释放了

	return 0;
}

3 指针 *** 作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。

#include
int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	for (int i = 0; i < 12; i++)
	{
		*p++ = i;  //指针越界访问(不会报错,但要避免这样写)
	}

	int* p1 = test(); //指针指向的空间释放(不会报错,但要避免这样写)
	printf("%d\n", *p1);  
	return 0;
}

4 野指针的危害:指针指向的内容已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致错误。野指针被定位到是哪里出现问题,在哪里指针就失效了,不好查找错误的原因。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914850.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存