题目一
void Getmemory(char* p){
p = (char*)malloc(100);
}
void Test(void){
char* str = NULL;
Getmemory(str);
strcpy(str, "hello wordl");
printf(str);
}
//运行Test会有什么结果
运行后发现程序崩溃
关于这个代码有如下几个错误
- malloc向内存申请一块连续可用的内存空间,并返回指向这块空间的指针,如果开辟失败,则返回一个空指针,因此一定要对malloc的返回值做检查。
- 函数结束后,p被释放,但是动态申请的空间必须手动释放,所以也造成了内存泄漏
- 手动释放后,还需要将p置为空指针
- str传到函数中,对p进行申请内存空间,实则更改的是p,对str无影响
正确代码
void Getmemory(char** p){
*p = (char*)malloc(100);
if (*p == NULL){
//申请失败处理
}
}
void Test(void){
char* str = NULL;
Getmemory(&str);
strcpy(str, "hello wordl");
printf(str);
free(str);
str = NULL;
或
void* Getmemory(){
char* p = (char*)malloc(100);
if (p == NULL){
//申请失败处理
}
return p;
}
void Test(void){
char* str = NULL;
str = Getmemory();
strcpy(str, "hello wordl");
printf(str);
free(str);
str = NULL;
}

这篇博客探讨了几道关于动态内存管理的经典笔试题目,包括内存分配、内存泄漏、指针使用等常见问题。文章指出,malloc返回的内存需检查,函数结束时要释放动态内存并置指针为空,防止内存泄漏和野指针。同时,局部变量的内存管理也是重点,正确处理内存分配和释放是避免程序崩溃和乱码的关键。
最低0.47元/天 解锁文章
708

被折叠的 条评论
为什么被折叠?



