首页 > 试题广场 >

以下对C语言的”指针“描述不正确的是:

[单选题]

以下对C语言的指针描述不正确的是:

  • 32位系统下任何类型指针的长度都是4个字节
  • 指针的数据类型声明的是指针实际指向内容的数据类型
  • 野指针是指向未分配或者已释放的内存地址
  • 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
答案选择D,原因如下:
free之后的指针仍然指向原来的堆地址,即仍然可以继续使用,但很危险。因为操作系统已经认为这块内存可以使用,它会毫不考虑的将他分配给其他程序,于是你下次不小心使用到该指针(野指针)时,如果操作系统及时制止了这种行为,报错(非法操作),然后将你的程序杀掉,给你很容易改正错误的机会,这还算比较好的结果!如果操作系统没有制止这种行为,那么产生的后果可就说不准了,说不定整个操作系统会崩溃,那么你再来改正这个错误,就不容易发现咯!所以,最好free了以后再置空,即令指针 = NULL;,表示 本程序已经放弃再使用该指针。
编辑于 2016-01-13 19:56:58 回复(5)
D
free指的是释放该指针所指向的内存资源,指针值没有变化,为了防止指针成为野指针,需要在free后将指针置为NULL。
发表于 2015-08-09 09:36:10 回复(0)
选择D:
编译器不会自动置NULL,需要程序员手动置NULL,否则free会产生野指针。
发表于 2015-09-04 22:36:45 回复(0)

想解释一下A选项:

指针变量存储的是内存的地址,所谓的内存地址就是一个编号而已。拿32位的操作系统举例,32位表示的是地址总线有32根,cpu通过这32根线确定一个内存单元。32位的0/1组合构成了这个6内存单元的地址,32位刚好4字节,所以指针占据4字节.但还是要根据操作系统位数来说。

就32位操作系统而言, int* p 和 char* p,指针p的大小都是4字节,至于指针前面的类型主要是针对于指针所指向的变量的。这个类型是告诉cpu取值的时候取多大,指定一个明确的范围。

编辑于 2019-05-09 10:42:19 回复(0)
对于B我不解的是如果是基类指针指向派生类对象呢
发表于 2016-03-10 17:29:59 回复(2)
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。 
    “野指针”不是NULL指针,是指向“垃圾”内存的指针。野指针的成因主要有两种: 
    (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 
    (2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
发表于 2017-04-19 21:14:21 回复(0)
D,free掉一个指针后,指针的值是不会自动置为NULL的,当然其指向的内存已经被释放,可以重新分配给其他进行使用,此时该指针被称为野指针。
对野指针进行操作,可能会破坏内存结构,因为并不知道当前指针指向的内容是什么,所以一般在free操作结束后,由程序猿将指针置为NULL。
发表于 2015-08-08 10:50:59 回复(0)
不会自动变为NULL,而是指向一个不确定的地方,所以在释放空间后,一定要将指针置为NULL
发表于 2016-05-19 14:54:51 回复(0)
D 指针不能自动置为NULL
发表于 2015-08-08 11:33:41 回复(0)
D,free之后指针值没变,只把只向的位置释放
发表于 2015-08-07 16:53:09 回复(0)
  • free对应的是malloc;delete对应的是new;
  • free用来释放malloc出来动态内存,delete用来释放new出来的动态内存空间。

区别

  1. 数组的时候int p=(int)malloc(10*sizeof(int)) 释放的时候 free(p)即可;这是因为编译器对malloc做了一些特殊的处理,以保证可以正确释放内存。而当int *p=new int[10]释放的时候应为delete []p,注意[]的作用说明释放的是一个数组的内存,如果delete p则只是释放的p[0],其余9个int的内存没有释放;这是因为当指明为[]的时候,编译器实际上是做了一个循环来释放这个数组的所有内存。

  2. 在类和对象的时候会有很大区别。在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数;使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数

联系

它们都是只把指针所指向的内存释放掉了,并没有把指针本身干掉。在free和delete之后,都需要把指向清理内存的指针置为空,即p=NULL,否则指针指向的内存空间虽然释放了,但是指针p的值还是记录的那块地址,该地址对应的内存是垃圾,p就成了“野指针”。同样会使人认为p是个合法的指针,如果程序较长,我们通常在使用一个指针前会检查p!=NULL,这样就起不到作用了。此时如果再释放p指向的空间,编译器就会报错,因为释放一个已经被释放过的空间是不合法的。而将其置为NULL之后再重复释放就不会产生问题,因为delete一个0指针是安全的。

总结:

1.指针消亡了,并不代表动态内存被自动释放了。

2.动态内存释放掉了,如果内存对应的是动态对象,则并不一定会调用这个对象的析构函数。调用了析构函数,并没有把指针消亡,或置为NULL;

3.动态内存记得用完了释放,指针记得不用了归NULL。不要让野指针野蛮生长

参考链接

https://blog.csdn.net/gukesdo/article/details/7506155

32位系统下任何类型指针的长度都是4个字节   指针是地址  32位 就是 4个字节 正确
发表于 2019-08-27 18:47:09 回复(0)
不会自动置NULL
发表于 2023-07-14 22:16:46 回复(0)
需要free后将指针置空
发表于 2023-07-08 10:09:14 回复(0)
free掉一个指针后,指针仍然指向原来的地址,free的意义在于告诉系统目标地址已经被收回
发表于 2022-12-27 17:50:16 回复(0)
a怎么对了
发表于 2022-04-22 07:36:31 回复(0)
指针的含义
发表于 2019-05-09 20:26:36 回复(0)
答案选择D,原因如下: free之后的指针仍然指向原来的堆地址,即仍然可以继续使用,但很危险。因为操作系统已经认为这块内存可以使用,它会毫不考虑的将他分配给其他程序,于是你下次不小心使用到该指针(野指针)时,如果操作系统及时制止了这种行为,报错(非法操作),然后将你的程序杀掉,给你很容易改正错误的机会,这还算比较好的结果!如果操作系统没有制止这种行为,那么产生的后果可就说不准了,说不定整个操作系统会崩溃,那么你再来改正这个错误,就不容易发现咯!所以,最好free了以后再置空,即令指针 = NULL;,表示 本程序已经放弃再使用该指针。
发表于 2018-11-29 20:10:47 回复(0)
对于B选项,如果声明一个void *p如何理解呢?
发表于 2018-05-15 15:39:22 回复(0)
free指的是释放该指针所指向的内存资源,指针值没有变化,为了防止指针成为野指针,需要在free后将指针置为NULL。
发表于 2017-08-18 13:07:18 回复(0)
避免野指针的步骤:
1、初始化指针,定义变量时置为 NULL
2、释放指针free时,先判断是否为NULL
3、释放完之后将指针变量赋值为NULL
发表于 2017-06-24 19:44:03 回复(0)