【C语言】动态内存规划经典笔试题

2023-12-28 16:03:02

目录

题目一:

题目二:

题目三:

?题目四:


?


题目一:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Getmemory(char*p)
{
	p = (char*)malloc(100);
}

int main()
{
	char*str = NULL;
	Getmemory(str);
	strcpy(str,"hello world");
	printf(str);
	return 0;
}

分析:

? ? ? ? getmemory函数创建了一个形参p,赋值为str(NULL)的值,开辟100字节空间并将空间首地址赋给p;

? ? ? ? 将字符串“hello world”拷贝到str,并用printf输出。

问题:


? ? ? ? 1.Getmemory函数采用值传递的方式,无法将malloc开辟空间的地址返回到str中,调用结束后str依然是NULL空指针;

? ? ? ? 2.strcpy中使用了str,就是对str(NULL)空指针的解引用操作,程序崩溃;

? ? ? ? 3.malloc的内存没有机会释放,导致内存泄漏。

?正确的写出Getmemory函数的关键是,能正确返回开辟的地址:

1.用传址调用

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Getmemory(char**p)
{
	*p = (char*)malloc(100);
}

int main()
{
	char*str = NULL;
	Getmemory(str);
	strcpy(str,"hello world");
	printf(str);
	return 0;
}

2.手动return返回

?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* Getmemory(char*p)
{
	p = (char*)malloc(100);
    return p;
}

int main()
{
	char*str = NULL;
	str = Getmemory(str);
	strcpy(str,"hello world");
	printf(str);
	return 0;
}

?


题目二:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* Getmemory(void)
{
	char p[] = "hello world";
	return p;
}

int main()
{
	char* str = NULL;
	str = Getmemory();
	printf(str);
	return 0;
}

分析:

? ? ? ? 创建str初始化为NULL;调用GetMemory函数,在函数中将字符串给p,返回p。

? ? ? ? 打印p指向的内容。

问题:

? ? ? ? 1.返回栈空间的地址导致的错误。

? ? ? ? 2.“hello world”字符串是在GetMemory函数内部的,创建在栈区;在调用GetMemory函数结束后,空间释放,这时返回p给str,str指向的空间不属于我们,str是野指针,对野指针解引用出错。


题目三:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void GetMemory(char** p,int num)
{
	*p = (char*)malloc(num);
}

int main()
{
	char* str = NULL;
	GetMemory(&str,100);
	strcpy(str,"hello");
	printf(str);
	
	return 0;
}

?

分析:

? ? ? ? 此题比较容易?

问题:

? ? ? ? malloc得到的空间在使用后没有释放,并置为空指针。

?在使用动态内存规划后要将开辟的空间释放,指针置空。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void GetMemory(char** p,int num)
{
	*p = (char*)malloc(num);
}

int main()
{
	char* str = NULL;
	GetMemory(&str,100);
	strcpy(str,"hello");
	printf(str);
	free(str);
	str = NULL;
	return 0;
}


?题目四:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char* str = (char*)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str!= NULL)
	{
		strcpy(str,"world");
		printf(str);
	}
	return 0;
}

?

分析:

? ? ? ? 动态内存开辟100字节,空间首地址给str;把字符串“hello”拷贝给str,释放str;

? ? ? ? 问题已经清晰了。

?

问题:

? ? ? ? 1.str指向的空间在使用中释放,这段空间就不属于我们,str成了野指针,但是str不是空指针;

? ? ? ? 2.str不为空,于是进入if,再次使用了str,导致错误。

?

在str被释放后,及时置空,这样就不会进入if中了?


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char* str = (char*)malloc(100);
	strcpy(str,"hello");
	free(str);
    str = NULL;
	if(str!= NULL)
	{
		strcpy(str,"world");
		printf(str);
	}
	return 0;
}


完~?

未经作者同意禁止转载?

文章来源:https://blog.csdn.net/2301_79465388/article/details/135257657
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。