void GetMmory(char *p) { p=(char *)malloc(100); } void Test(void) { char *str=NULL; GetMemory(str); strcpy(str,“hello world”); printf(str); } 检查错误,并修改,且画出代码内存图
时间: 2024-02-17 09:04:53 浏览: 39
这段代码有两个问题:
1. GetMmory 函数中修改了指针 p 的值,但是这个修改没有被传递到 Test 函数中,因此 Test 函数中的 str 指针仍然为 NULL。
2. Test 函数中的 GetMemory 函数分配了一块内存,但是没有检查分配是否成功,如果分配失败,会导致后面的 strcpy 函数和 printf 函数出现问题。
修正后的代码如下:
```c
void GetMemory(char **p) {
*p = (char *)malloc(100);
}
void Test(void) {
char *str = NULL;
GetMemory(&str); // 传递 str 指针的地址
if (str == NULL) { // 检查分配是否成功
printf("Failed to allocate memory\n");
return;
}
strcpy(str, "hello world");
printf("%s", str);
free(str); // 记得释放内存
}
```
修正后的代码中,GetMemory 函数的参数变成了一个 char ** 类型的指针,表示传递的是一个指针的地址。在函数中,通过修改指针的地址来改变 Test 函数中的 str 指针的值。并且在分配内存后,通过判断指针是否为 NULL 来检查分配是否成功。
内存图如下:
```
+---------------------+
| Test |
+---------------------+
| str ==========> NULL |
+---------------------+
+---------------------+
| GetMemory |
+---------------------+
| p ==========> &str |
+---------------------+
+---------------------+
| malloc |
+---------------------+
| ptr ==========> (memory block) |
+---------------------+
```
在执行 Test 函数时,首先创建一个指针变量 str 并将其初始化为 NULL。然后调用 GetMemory 函数,将 str 的地址传递给 GetMemory 函数。在 GetMemory 函数中,通过修改 p 指针的值,将 str 指针指向了一块新分配的内存。
最后,在 Test 函数中,通过 strcpy 函数将字符串 "hello world" 拷贝到 str 指针指向的内存中,并通过 printf 函数将字符串打印出来。最后,记得释放内存。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)