C语言的动态内存分配与void指针类型

目录:

1.什么是动态内存分配

2.怎么动态内存分配和释放

3.void指针类型

参考资料:

[1]谭浩强. C程序设计(第四版)[J]. 计算机教育, 2010, No.128(20):113-113.

1.什么是动态内存分配

1)全局变量的内存空间分配在静态存储区

2)非静态的局部变量(包括函数形参)分配在内存中的动态存储区,这个区域称为栈stack区域。

C允许建立内存的动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等待函数结束才释放,

需要是由用户随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆heap区。由于未在声明部分定义他们未变量或数组,因此不能通过变量名或数组名去访问这些数据,只能通过指针来访问。

2.怎么动态内存分配和释放:

对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc、calloc、free、realloc这4个函数,它们声明在stdlib.h头文件中:

#include<stdlib.h>

1)

void* malloc(unsigned int size);

在堆区分配size个字节大小的连续的内存区域,并返回所分配区域的第一个字节的地址,分配不成功则返回NULL(空指针)。

2)

void* calloc(unsigned int n, unsigned int size);

在堆区分配n个大小为size个字节的连续内存空间区域,函数返回指向所分配区域的起始位置的指针!分配不成功则返回NULL(空指针)。

calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素大小为size个字节。这就是动态数组。

例如:

int * p = (int*)calloc(50, sizeof(int));//开辟50*4个字节的临时存储区域,把起始地址赋给指针变量p

p[0] = 1;
p[1] = 2;
cout << p[0] << "," << p[1] << endl;

3)

void* realloc(void* p, unsigned int size);

将p指针所指向的内存空间的大小改为size个字节,p值不变,如果重新分配不成功,则返回NULL

如果已经通过malloc()或calloc()函数获得了动态存储空间,想要改变它的大小,可以用realloc()函数。

4)

void free(void* p);

 释放指针变量p所指向的已经分配的动态内存空间,注意是释放已经分配了的内存空间。重复释放将编译报错!

C99标准将以上4个函数的基类型定义为void类型,这种指针称为无类型指针(typeless pointer):

即不指向哪一种具体的数据类型,只表示用来指向一个抽象的类型的数据,即近提供一个纯地址,而不能指向任何具体的对象!

int a = 3;
int* p1 = &a;
char* p2;
void* p3;//p3为无类型的指针变量,基类型为void型
p3 = (void*)p1;
p2 = (char*)p3;

cout << "*p1=" << *p1 << endl;
//cout << "*p3=" << *p3 << endl;//错误:非法的间接寻址!
cout << "*p2=" << *p2 << endl;//输出ACSII字符表的3代表的字符?!vs下是个方框!
/*
*p1=3
*p2=
*/
p3 = &a;
//cout << "*p3=" << *p3 << endl;//错误:p3是无指向了,不能指向a
// C_malloc_void.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>

//void* malloc(unsigned int size);
//
//void* calloc(unsigned int n, unsigned int size);
//
//void free(void* p);
//
//void* realloc(void* p, unsigned int size);

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	//int * p = (int*)calloc(50, sizeof(int));
	//p[0] = 1;
	//p[1] = 2;
	//cout << p[0] << "," << p[1] << endl;

	int a = 3;
	int* p1 = &a;
	char* p2;
	void* p3;//p3为无类型的指针变量,基类型为void型,
	/*p3这个指针基本上是一个无效指针(就是不能直接访问p3所指的内容)!?
	要么将其传递给其他具体类型的指针(或者传给其他具体类型的函数形参)
	只有用具体类型的指针才知道怎么解析该指针指向的内存空间。*/

	p3 = (void*)p1;
	p2 = (char*)p3;

	cout << "*p1=" << *p1 << endl;
	//cout << "*p3=" << *p3 << endl;//错误:非法的间接寻址!
	cout << "*p2=" << *p2 << endl;//输出ACSII字符表的3代表的字符?!vs下是个方框!

	p3 = &a;
	//cout << "*p3=" << *p3 << endl;//错误:p3是无指向了,不能指向a
	system("pause");
	return 0;
}

/*输出:
*p1=3
*p2=
请按任意键继续. . .
*/

 

C语言的动态内存分配与void指针类型 

猜你喜欢

转载自blog.csdn.net/m0_37357063/article/details/81704454