当前位置:网站首页>[Study Notes Dish Dog Learning C] Classic Written Exam Questions of Dynamic Memory Management
[Study Notes Dish Dog Learning C] Classic Written Exam Questions of Dynamic Memory Management
2022-08-05 05:16:00 【Jiang Junzhu】
题目一:
- 问题
Please ask the following code,运行Test 函数会有什么样的结果?
void GetMemory(char* p) {
p = (char*)malloc(100);
}
void Test(void) {
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main() {
Test();
return 0;
}
- 代码分析
str传给GetMemoryThe function is passed the value,所以GetMemory函数的形参pWhat is received is a null pointer.GetMemoryThe function performs dynamic space application internally,地址存放在p中,并不会影响Test函数中的str.所以str的值依旧是NULL,所以strcpy失败.并且当GetMemory函数运行完之后,形参p销毁,dynamically developed100bytes of memory are not freed,这样就会导致内存泄露. - 图解
- 错误更正
char* GetMemory(char* p) {
p = (char*)malloc(100);
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
return 0;
}
题目二
- 问题
Please ask the following code,运行Test 函数会有什么样的结果?
char* GetMemory(void) {
char p[] = "hello world";
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
return 0;
}
- 代码分析
GetMemory函数内部创建的数组是在栈区上创建的,当函数结束时,This space is also destroyed,因此pArrays have no space,返回pThe address of the array has no real meaning.如果strUse the returned address to access memory,就是非法访问. - 图解
- 错误更正
char* GetMemory(void) {
char* p = (char*)malloc(15);
p = "hello world";
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
return 0;
}
题目三
- 问题
Please ask the following code,运行Test 函数会有什么样的结果?
void GetMemory(char** p, int num) {
*p = (char*)malloc(num);
}
void Test(void) {
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
int main() {
Test();
return 0;
}
代码分析
GetMemory函数获取str的地址,Then dynamically open up a space,Hand over the address of this spacestr,最后拷贝“hello”并打印,没有一点问题,But he did not perform memory release,会导致内存泄漏.图解
错误更正
void GetMemory(char** p, int num) {
*p = (char*)malloc(num);
}
void Test(void) {
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
return 0;
}
题目四
- 问题
Please ask the following code,运行Test 函数会有什么样的结果?
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main() {
Test();
return 0;
}
代码分析
The problem with this code is that it doesn't empty,will result in a wild pointer,野指针是非常危险的.当free时,Dynamically opened space has been freed up,只不过strRemember the address of this space,Assigning a value to this space is illegal access.图解
错误更正
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main() {
Test();
return 0;
}
边栏推荐
猜你喜欢
Flutter learning 5-integration-packaging-publish
coppercam primer [6]
jvm 三 之堆与栈
A blog clears the Redis technology stack
8.04 Day35-----MVC three-tier architecture
结构光三维重建(二)线结构光三维重建
『递归』递归概念与典型实例
u-boot debugging and positioning means
Detailed explanation of each module of ansible
Dephi逆向工具Dede导出函数名MAP导入到IDA中
随机推荐
Cryptography Series: PEM and PKCS7, PKCS8, PKCS12
Flutter real machine running and simulator running
The role of DataContext in WPF
After controlling the export file in MySQL, it becomes \N. Is there any solution?
[Surveying] Quick Summary - Excerpt from Gaoshu Gang
[WeChat applet] WXML template syntax - conditional rendering
"Recursion" recursion concept and typical examples
Redis - 13. Development Specifications
RL reinforcement learning summary (1)
MySQL Foundation (1) - Basic Cognition and Operation
电话溥功能
Geek卸载工具
软件管理rpm
Multi-threaded query results, add List collection
MySQL基础(一)---基础认知及操作
Understanding and use of C# on set() and get() methods
University Physics---Particle Kinematics
一篇博客通关Redis技术栈
Day019 Method overriding and introduction of related classes
2023 International Conference on Information and Communication Engineering (JCICE 2023)