- 1NULL和nullptr
- 2 野指针
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 野指针的危害:指针指向的内容已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致错误。野指针被定位到是哪里出现问题,在哪里指针就失效了,不好查找错误的原因。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)