在定义变量的时候,为什么int x;
会被分配一块有效内存,但是int *x;
只会被随机分配一块内存地址变成野指针
分配地址为什么是不一样的。
int * x同样分配一个有效内存,只不过这个内存存储的是一个地址信息而已
为什么是野指针,是因为这个地址信息是个不确定的值,取决于上一个占用这个内存空间的程序在内存里写的是什么。显然这个值你现在的程序无法预测,且这个值会被作为一个地址看待,那么这个地址当前程序并没有申请占用,所以要么这个地址是禁止访问的,要么这个地址被别的程序占用。你强行去访问就出问题了。
指针的本质是里面存的是个地址
int x里面是个随机值,你如果不初始化而直接用来做加减法,结果肯定不是你期望的
而int *x里面的随机值代表一个随机的地址,你如果不初始化而直接去访问那个不知道在哪的地址,当然就是典型的野指针
指针和变量分配内存地址的区别在于,当定义一个变量时,编译器会为其分配一块有效内存地址,而当定义一个指针时,编译器仅为其随机分配一块内存地址。这是由于变量定义时编译器需要为其分配内存(根据类型的内存大小),而指针只是记录了一个地址,指针指向的内存空间可能是未分配或无法访问的,因此需要手动将指针指向一个已经分配且可以访问的地址。
具体解决方案:
对于变量的内存分配,编译器根据变量的类型为其分配一块内存空间,可以通过sizeof运算符获取其大小。而对于指针的内存分配,则需要使用malloc函数手动申请内存,然后将指针指向该内存地址,示例代码如下:
int *p = (int *)malloc(sizeof(int)); // 申请一块int类型的内存空间
if (p == NULL) {
printf("内存不足");
exit(-1);
}
*p = 10; // 为p指针指向的内存空间赋值
当不再需要这块内存空间时,需要使用free函数将其释放,以避免内存泄漏。
free(p); // 释放p指针所指向的内存空间
在使用指针时,需要注意指针指向的内存空间是否已经分配,避免出现野指针等问题。
参考资料:
C语言中的指针和变量 https://www.ahalei.com/2021/06/10/188.html
strtol和malloc函数的内存分配 https://www.cnblogs.com/zxf330301/p/4705333.html