C/C++教程

c动态内存分配-笔试题

本文主要是介绍c动态内存分配-笔试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 一.

返回栈空间地址问题

非法访问内存-程序崩溃

数组p在栈空间创建了一个空间,出了函数的作用域,生命周期结束

用指针变量str接收p的地址,而p已经被销毁

栈区:局部变量,函数的形式参数

数组p是局部变量 出了Getmemory函数被销毁

二. 

int* test()
{
	int a = 10;
	return &a;
}
int main()
{
	
	int*ptr= test();
	return 0;
}
修改:返回静态区空间地址
int* test()
{
	static int a = 10;
	return &a;
}
int main()
{
	
	int*ptr= test();
	return 0;
}

 

三. 

int* test()
{
	int* p = malloc(40);  返回堆空间地址
	return p;
}
int main()
{
	
	int*ptr= test();
	return 0;
}

四. 

 

void GetMemory(char* p)p=str的临时拷贝,此时p指向的是NULL
{                      
	p = (char*)malloc(100); p存放-在堆区开辟空间的内存地址
}
                            p销毁
void Test(void)
{
	char* str = NULL;
	GetMemory(str);            值传递=str是指针名Getmemory()传的是指针
	strcpy(str, "hello world");此时str存放的仍是NULL
                               非法访问内存-程序崩溃
	printf(str);

}

五. 

 

 

 

输出hello--但是忘记释放,导致内存泄漏 

六. 

 

 释放str所指向的空间后,空间被系统收回,而后面又要将world复制到str所指向的空间,所以非法访问内存

修改: 

void test()
{
	char* str = (char*)malloc(40);
	free(str);
	strcpy(str,"hello");
	str = NULL;
	if (str!=NULL)
	{
		strcpy(str,"world");
	}
	return 0;
}
int main()
{
	test();
	return 0;
}

七.柔性数组

struct S
{
	int a;
	int arr[];
};
int main()
{
	struct S* p = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	int i;
	if (p!=NULL)
	{
		for (i = 0; i < 5; i++)
		{
			p->arr[i] = i;
			printf("%d", p->arr[i]);

		}
	}
	
	struct S* ps = realloc(p,40);
	if (ps!=NULL)
	{
		ps = p;
		for ( i = 5; i < 10; i++)
		{
			p->arr[i] = i;
			printf("%d", p->arr[i]);
		}
	}
	free(ps);
	ps = NULL;
	return 0;
}

 

 

 

struct S
{
	int a;
	int*arr;
};
int main()
{
	struct S* p = (struct S*)malloc(sizeof(struct S) );
	p->arr = malloc(5*sizeof(int));
	int i;
	
	
		for (i = 0; i < 5; i++)
		{
			p->arr[i] = i;
			printf("%d", p->arr[i]);

		}
	
	
	struct S* ps = realloc(p->arr,40);
	if (ps!=NULL)
	{
		ps->arr = p;
		for ( i = 5; i < 10; i++)
		{
			p->arr[i] = i;
			printf("%d", p->arr[i]);
		}
	}
	free(p);
	ps = NULL;
	free(p->arr);
	p->arr = NULL;

	return 0;
}

 

这篇关于c动态内存分配-笔试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!