- 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:
#include2 野指针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; }
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释放后,如果程序员没有对其进行置空或者其他赋值操作的话,就会成为一个野指针。
#includeusing 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 指针操作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。
#includeint* 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("%dn", *p1); return 0; }
4 野指针的危害:指针指向的内容已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致错误。野指针被定位到是哪里出现问题,在哪里指针就失效了,不好查找错误的原因。



