首页 > 试题广场 >

下面代码片段中有哪些隐患或者错误 void *get1

[问答题]

下面代码片段中有哪些隐患或者错误

void *get1(){

                      char buf[12] = {"abc"};

                      return buf;

}

void get2(int *p){

p = new int[10];

}

int main(){

int *m;

get2(m);

m = get1();

memcpy(m, "aaa", 3);

return 0;

}

1.首先调用get2(m)的时候,因为是值传递,无法修改m的实际值,即无法讲new申请的内存地址传出

2.再者调用get1(m)的时候,函数内定义的数组是局部变量,对应的内存在这个函数结束的时候就会被释放,因此返回的地址是无效的,调用这样的地址造成严重错误。

3.最后调用memcpy(m,"aaa",3)往一个没有权限的无效内存空间拷贝数据是非法的。
发表于 2018-07-25 19:54:17 回复(2)
int *m;//指针最好初始化,野指针容易出现非法访问
p=new int [10];//new分配空间在堆,不会自动释放,需要手动释放内存
return buf//指定返回类型不匹配,返回临时变量会出问题
memcpy(m, "aaa", 3);//非法拷贝
编辑于 2019-09-09 09:35:25 回复(0)
首先get2()是可以将new的地址传出来的,new在堆区会开辟内存,但是得手动释放,此处没有释放内存,get1()中局部变量放在栈区,返回指针后,指针就会被清空,此时变量相当于野指针,此时赋值是很危险的
发表于 2018-08-25 11:59:38 回复(0)
1.  ger1()返回类型与return buf 类型不匹配
2.  new int[10] 没有释放
3.  m没有初始化,情况下使用m指向的地址作为参数赋给get2() 的p,即将一个未知的地址强制转换为 (int *)并开辟了一个 new int[10]的内存,这样问题比较大,题中用意应该是将m的地址&m赋给get2()
( get2(&m))
4.  m = get1();,   get1()里的buf在函数返回后被释放,所以m任然指向一个未知地址
5.  对一个野指针拷贝
发表于 2024-06-27 12:00:35 回复(0)
往一个没有权限的无效内存空间拷贝属于非法拷贝。
发表于 2023-02-19 15:34:13 回复(0)
1.m指针定义时没有赋初值,危险
2.m是int型指针,不能接受void型指针的返回值
3.get2(m)后,先传入m的地址后来在函数里p的地址又改了,带不出来。而且new的内存在堆中,需要free
4.m是int型指针,无法拷贝字符串aaa
发表于 2021-04-09 15:26:49 回复(0)
答:
第一、get2 方法入参是一个一级指针,对于入参m,一级指针不能吧get2 中分配的内存带出来,可以修改get2的入参为二级指针,或者返回值改为指针类型;
第二、get1方法返回的是局部变量地址,在函数返回时资源以及被回收,所以get1返回的变量不能使用,memcpy 操作会出现未知错误。

发表于 2020-10-18 14:25:36 回复(0)
1.返回局部变量的指针该变量已被释放,使用该区域可能会有意想不到的错误
2.想要带出一个指针必须使用二级指针
3.想要进行字符串拷贝使用strcpy
发表于 2020-05-15 23:04:33 回复(0)
【1】*get函数中,返回char型,但函数应返回void空,不符合;
【2】*get函数中,buf地址作为局部变量放在栈区,这个函数结束后局部变量消失,buf地址是无效的,返回给buf的是无效地址,野指针;
【3】get2函数,new开辟内存应free释放;
【4】main中,memcpy语法错误,应把“aaa”放到某地址,再作为source发到m地址;
发表于 2019-11-07 09:56:11 回复(0)
get2(m);中,属于传值调用,并不能把分配的地址传递出去;
m = get1();为在栈上分配的内存,调用结束后,内存会被释放,返回的地址是无效;
memcpy(m,"aaa",3);往一个没有权限的无效内存空间拷贝数据属于非法拷贝;
编辑于 2019-10-21 11:33:17 回复(0)
1. get1为在栈上分配的空间,调用结束,栈回收;
2. get2中,虽然分配了一个数组在堆上,但是属于传值调用,并不能把分配的地址传递出去。
发表于 2019-08-21 14:58:29 回复(0)

void *get1(){

                      char buf[12] = {"abc"};

                      return buf;

}

void get2(int *p){

p = new int[10];

}

int main(){

int *m;

get2(m);

m = get1();

memcpy(m, "aaa", 3);

return 0;

}


发表于 2019-04-15 11:11:03 回复(0)
get2不能返回动态内存,为值传递,应该传m的地址
返回局部变量
发表于 2018-10-04 15:40:54 回复(0)
出现段错误,因为
发表于 2018-09-06 19:05:38 回复(0)
首先 get2()中的指针p值申请内存,却没有在程序中释放内存。另外指针m 通过get2(m)并没有分配到内存空间,并且m没有被初始化,是野指针。m=get1()对野指针m进行了操作,可能引起系统崩溃。另外get1()函数返回栈上的局部变量,本身也是错误的,buf在get1()函数结束后会被释放。
发表于 2018-08-17 09:24:21 回复(0)