首页 > 试题广场 >

请问运行test函数会有什么样的结果?

[单选题]
void getmemory(char *p)
{ 
    p=(char*)malloc(100);
}
void test(void)
{
   char * str = null;
   getmemory(str);
   strcpy(str,”hello,world”);
   printf(str);
}
请问运行test函数会有什么样的结果? 
  • 编译错误
  • 输出"hello world"
  • 输出""
  • segmentation fault
推荐
D

题目想要通过一个函数来创建一个字符串数组:
             首先,这个想法是可以实现的;
             其次,题目中的形参有误,导致p指针没有变化。
下面先贴上正确的函数实现方式,仔细看哪一点不同:
void getmemory(char *&p)
//             char *p就是错的,因为p没有传出来 
{
    p=(char*)malloc(100);
    //p = new char[100];
    memset(p,'\0',sizeof(p[0])*100);
}
        形参由char *p改成char *&p就正确了,代码中memset用来初始化新开辟空间为'\0',没有memset也能编译通过,并且得到正确结果。
        题目的目的应该是考查指针的在函数中的传入和传出。本题中,在主函数中的str指针要通过getmemory函数,去指向一个新的char[100]的内存地址,我们知道,在函数中malloc出一个新空间,是在堆中生成的,即可以在函数外使用。知道本题的目的,就可以用另一种传入传出指针的方式来实现:
#include <iostream>
void getmemory(char **p)
{
    *p=(char*)malloc(100);
    //p = new char[100];
     memset(*p,'\0',sizeof(*p[0])*100);
}

int main(int argc, char *argv[])
{
   char * str = NULL;
   getmemory(&str);
   strcpy(str,"hello,world");
   printf("%s",str);

   return 0;
}
        
编辑于 2015-12-08 14:22:49 回复(6)
关于代码:
给函数传递参数时,若要改变变量值,传递一级指针,若要改变一级指针的值,传递二级指针,依次类推。
注意:传递给函数的参数在函数中的改变,不会影响原来的变量/指针本身。
因此正确的写法是:
void getmemory(char **p){
    *p = (char *)malloc(100);
} 
void test(void){
    char *str = NULL;
    getmemory(&str);  //对指针str取值,传递二级指针
    strcpy(str, "hello,world");
    printf(str);
} 
关于错误:
A. 类型正确,语义语法正确,编译器不会报错。
B. 拷贝没成功。
C. 什么鬼。
D. 导致Segementation Fault的原因很多,比如此题中使用了没有申请的内存(函数getmemory中申请了,没有赋给函数test中的str);
发表于 2015-09-07 13:49:31 回复(1)
这道题,其实最简单的思路,无非就是考察你对按值传递和按地址传递和按指针传递的知识点。
该题,就是让答题人,弄清楚,按值传递和按指针传递的思路。
它是按值传递,因而,不会改变传递过来的参数 的值。也就是不会改变指针str指向的值了。
因而返回到main函数之后,str仍然指向的是NULL,因而没有内存,没有申请内存,固然不能使用strcpy操作。

segmentation fault这个错误是由于访问了非法内存地址而引起的,因此,产生这个错误的原因就可能是以下几种:   1,数组越界.    这个很好理解,就是本来只定义了一个char s[10]的数组,却在程序中访问了s[10].当然在程序中若出现问题是不可能这么显而易见的.   
2,访问空,野指针或未被初始化的指针.    空指针是指值为NULL的指针,不指向任何内存;   野指针是指值不确定的指针,指向不确定的内存;   未被初始化的指针和野指针一样,其值是不确定的.
发表于 2017-02-22 10:27:13 回复(1)
getmemory(str);把指针str传递进去了进去,然而这是值传递,而非引用传递,所以函数外部的参数str并不会发生改变,这么一来,这个 getmemory(str)对str没有改变,str仍然是指向字符的空指针,所以在执行strcpy(str,”hello,world”);这一句是会提示内存访问超出了范围。
Segmetation Fault意思是程序访问非法的内存。
选D。
编辑于 2018-01-19 19:51:58 回复(0)
因为满足语法,编译能通过;
运行的时候出错提示segmentation fault;
本题给形参分配内存,实参依旧是空指针
切记,除了引用之外的形参都是临时变量
编辑于 2019-06-06 16:52:02 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getmemory(char **p){
    *p = (char *)malloc(100);
}
void main(void){
    char *str = NULL;
    getmemory(&str);  //对指针str取值,传递二级指针
    strcpy(str, "hello,world");
    printf(str);
}
//给函数传递参数时,若要改变变量值,传递一级指针,若要改变一级指针的值,传递二级指针,依次类推。

发表于 2016-06-06 19:11:10 回复(0)
D。
调用getmemory(str)后,在test函数内的局部变量str并未产生变化。 strcpy ( str ,” hello , world ”); 写越界,造成segmentation fault。
编辑于 2015-12-08 14:20:00 回复(0)
给函数传递参数时,若要改变变量值,传递一级指针,若要改变一级指针的值,传递二级指针,依次类推。
发表于 2019-09-06 15:37:03 回复(0)
尴尬了,传递的形参不能改变str指针的位置。要是char **才行,用二级指针。或者引用也行,char * &a;,不知道这种行不行,没试过...
编辑于 2018-10-27 23:42:00 回复(0)
360奇虎这个软件存在危险窃取电话号码,骚扰电话号码窃取借钱人电话号码
编辑于 2018-04-19 18:51:14 回复(0)
传指针,只能改变指针指向的内容;同理,要传二级指针,才能改变指针。
发表于 2018-03-14 14:39:22 回复(0)
参数传递是要注意参数类型的级别,实参int对应的形参是int *,实参int *对应的形参是int **
发表于 2017-10-24 20:29:31 回复(0)
函数的实参只是形参的拷贝,所以无法修改形参。
若实参是个内存地址(我并没有说是指针啊),解析后赋值,那么就可以改变形参的值。

指针也是一个变量,在栈中也有它自己的内存地址,因此在另一个函数想要改变它时,应该取它的地址,在那个函数中解析再赋值
发表于 2017-07-28 17:33:10 回复(0)
#include "iostream" using namespace std; int b=2; void printP(int *p)
{
    p = &b;
} void printP2(int *&p)
{
    p = &b;
} int main()
{ int a=1; int *p = &a;
    printP(p);
    cout<<p<<" "<<*p<<endl;//0x7fff5839e71c 1

    printP2(p);
    cout<<p<<" "<<*p<<endl;//0x1078630c0 2
}

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
编辑于 2017-03-28 11:29:58 回复(0)
将指针p返回,赋给str就可以了。
发表于 2017-03-06 18:26:54 回复(0)
没有初始化
发表于 2016-12-01 22:37:17 回复(0)
segmentation fault访问错误
发表于 2016-11-06 19:48:25 回复(0)
voidgetmemory(char*p)
{
    p=(char*)malloc(100);
}
如果要修改一级指针,形参得用二级指针才可以
voidgetmemory(char**p)
{
   *p=(char*)malloc(100);
}
发表于 2016-06-01 10:58:07 回复(0)
  类型正确 ,语义语法正确,编译器不会报错
导致segmentation fault的错误类型很多。
发表于 2016-05-26 21:52:42 回复(0)
http://blog.csdn.net/xiven/article/details/4345199
这个博客里面有详细解释  getmemory()函数的经典例题

发表于 2016-04-29 10:16:50 回复(0)
假设str指向0x90,将str作为形参传给函数get,子函数中p被赋值为0x60,对str指向的地址没影响。改成get(*&p)后,p相当于对str指向的内容进行操作,所以影响了str
发表于 2015-12-07 17:43:17 回复(0)