c语言如何给指针参数赋值为null?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言如何给指针参数赋值为null?相关的知识,希望对你有一定的参考价值。

用指针的引用即可.
例如:
int
memnull(int
*¶m)

param
=
NULL;
return
0;

在另一个函数里调用它:
int
*a;
memnull(a);
memnull运行完之后a的地址就被修改为NULL了.
或者可以用指针的指针:
int
memalloc(int
**param)

*param
=
NULL;
return
0;

调用的时候这样调用:
int
*a;
memnull(&a);
这样memnull函数运行完后a的地址也会被修改为NULL.
同理其他操作,申请空间,改变指向等,也可以用指针的引用和指针的指针这两种方法完成.不过还是推荐指针的引用,在写代码时不容易写错.
参考技术A 1、既然是指针变量,那么将一个变量的地址值赋值给该指针变量即可!
2、至于具体讲一个地址值赋值给指针有两种方法:一种就是用取地址符&来操作内嵌变量,另一种就是通过采用malloc函数动态开辟内存并将内存地址值赋值给指针变量。
3、举例说明:定义int型指针变量int
*
p;和int型变量int
a;那么将a的地址值赋值给p:p=&a;另一种方式是动态方式:p
=
(int*)malloc(size(int));
参考技术B 楼主
其实很简单,例如你定义一个int
a;
然后把&a的带入你的函数中,函数的形参为int
*p;
在函数中把*p=null,不过最好是用宏定义,把null定位0;
这样a变量的地址所指向的值就变为0了
你要是有什么不懂得可以找我
参考技术C 想实现你的想法也不难,只要用指针的指针即可,下面是我写的一个测试用例:
#include
void
Func(int
**
p)

*
p
=
NULL;

int
main()

int
a
=
1;
int
*
p
=
&a;
Func(&p);
if
(p
==
NULL)

printf("p
==
NULL\n");

else

printf("p
!=
NULL\n");

return
0;

C语言 野指针和空指针

空指针

标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针为NULL,可以给它赋值一个零值。为了测试一个指针百年来那个是否为NULL,你可以将它与零值进行比较。

对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针因引用是一个非法的操作,在解引用之前,必须确保它不是一个NULL指针。

问题思考:

如果对一个NULL指针间接访问会发生什么呢?
结果因编译器而异。
像VS就报错,像DEV这种牛逼的编译器就没事。

案例探索:不允许向NULL和非法地址拷贝内存

不允许向NULL和非法地址拷贝内存:

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;

void test() {
	char *p = NULL;
	//给p指向的内存区域拷贝内容
	strcpy(p, "1111"); //err

	char *q = (char *)0x1122;
	//给q指向的内存区域拷贝内容
	strcpy(q, "2222"); //err		
}

int main()
{
	test();
	return 0;
}

运行上面的案例就会报错。

野指针

在使用指针时,要避免野指针的出现:
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

什么情况下会导致野指针?

指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

比如下面代码

void test(){
	int* p = 0x001; //未初始化
	printf("%p\\n",p);
	*p = 100;
}

虽然手动给出了地址,但是仍没有指向合法的内存

指针释放后未置空

有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

如何规避野指针

操作野指针是非常危险的操作,应该规避野指针的出现:

初始化时置 NULL

指针变量一定要初始化为NULL,因为任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。

比如上面的案例,就可以改成:

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;

void test() {
	int* p = NULL; //初始化
	printf("%p\\n", p);

	p = new int;
	*p = 100;
	printf("%p\\n", p);
	printf("%d\\n", *p);
}
int main()
{
	test();
	return 0;
}

释放时 置 NULL

当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。

例如上面使用完了之后,可以进行下面的操作 释放p 置 NULL。

	delete p;
	p = NULL;

以上是关于c语言如何给指针参数赋值为null?的主要内容,如果未能解决你的问题,请参考以下文章

C语言 将整型变量赋值为空

c语言如何给结构体指针赋值?

请问C语言 char类型的指针要怎么赋值?

C语言 NULL赋结构体指针变量

在C语言编程中,为啥要将指针变量在开始的时候赋值为NULL?

C语言如何给用函数二维数组动态赋值