以下这段代码有什么问题吗: #include <stdio.h> /* 在get1() 中,定义的buf属于占空间,当函数结束后,buf 的内存空间已经被释放,而返回的指针仍然指向这块已经释放的内存空间,在使用这个指针时可能会导致程序崩溃或产生未定义行为。所以main函数中 m 为一个野指针*/ void *get1(){ char buf[12] = {"abc"}; return buf; } void get2(int *p){ p = new int[10]; } int main() { int *m; get2(m); //属于值传递,应为&m m = get1(); //m 为int型,而get1返回的是void型,这在编译时会出问题 memcpy(m,"aaa",3); //由于上面get1中buf已被释放,所以这里会出现段错误 return 0; } 可以改成如下,用C++运行 #include <stdio.h> #include <string.h> char *get1(){ char *buf = new char[12]; strcpy(buf, "abc"); return buf; } void get2(int **p){ *p = new int[10]; } int main() { int *m = NULL; get2(&m); char *p = get1(); memcpy(m, "aaa", 3); delete[] p; delete[] m; printf("sss\n"); return 0; }
时间: 2023-06-26 20:05:13 浏览: 101
在第一个代码中,有如下问题:
1. 在 get1() 函数中,定义的 buf 是局部变量,当函数结束后,buf 的内存空间已经被释放,而返回的指针仍然指向这块已经释放的内存空间,在使用这个指针时可能会导致程序崩溃或产生未定义行为。因此,get1() 函数需要改成返回动态分配的内存空间。
2. 在 get2() 函数中,传递的参数 p 是一个指针,属于值传递。如果要修改指针的值,需要传递指向指针的指针。
3. 在 main() 函数中,m 是一个野指针,没有初始化。在 get2() 函数中,也没有对传入的指针进行初始化。应该将 m 初始化为 NULL,并且在 get2() 函数中传入指向指针的指针,对指针进行初始化。
4. 在 main() 函数中,m 是一个 int 类型的指针,而 get1() 函数返回的是 void 类型的指针,这会导致编译错误。应该将 get1() 函数改成返回 char* 类型的指针。
5. 在 main() 函数中,使用 memcpy() 函数将 "aaa" 复制到 m 所指向的内存空间中,但是在 get1() 函数中,buf 已经被释放,这样会导致段错误。应该先将 get1() 函数返回的指针保存到一个变量中,然后再进行操作。
以下是修正后的代码:
```cpp
#include <stdio.h>
#include <string.h>
char *get1() {
char *buf = new char[12];
strcpy(buf, "abc");
return buf;
}
void get2(int **p) {
*p = new int[10];
}
int main() {
int *m = NULL;
get2(&m);
char *p = get1();
memcpy(m, "aaa", 3);
delete[] p;
delete[] m;
printf("sss\n");
return 0;
}
```
阅读全文