动态内存分配

前边的补充:数字字符转化为数字需要减去字符'0'

补充:char* arr[10]是数组

1.等号两边的数据的类型必须一致

2.可以将右边强制类型转化为左边的类型

如:int* p = (int*)malloc(40);

void *malloc( size_t size );

如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个 NULL 指针,因此malloc的返回值一定要做检查。

3.perror会将对应函数的错误信息打印出来

如:

#define _CRT_SECURE_NO_WARNINGS 1
#include

int main()
{
	perror("printf");
    //输出结果:printf: No error

	return 0;
}

4.malloc申请的空间是在内存的堆区

5.free函数用来释放动态开辟的内存。

6.

void free( void *memblock );

后边那个指针指向的是要释放的空间的起始地址

如果参数ptr是NULL指针,则free函数什么事都不做

注意释放了空间之后记得将那个指针置为空指针

7.void *calloc( size_t num, size_t size );

前边那个参数是多大的空间(以int或char那样的类型为单位),后边那个参数是int还是char这样的类型

示例:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

int main()
{
	int* p = (int*)calloc(10, sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d", *(p + i));
	}
	//输出结果:0000000000

	return 0;
}

calloc函数的功能是为 num个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0.
与函数 malloc 的区别只是calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

8.

void *realloc( void *ptr, size_t size );

ptr是要调整的空间的起始地址
size是调整之后新的大小
返回值为调整之后的内存起始位置
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
realloc在调整内存空间的是存在两种情况:
情况一:原有空间之后有足够大的空间
情况二:原有空间之后没有足够大的空间

情况二:在已经开辟好的空间后边,没有足够的空间,直接进行空间的扩大在这种情况下,realloc函数会在内存的堆区重新找一个空间 (满足新的空间的大小需求的同时会把旧的数据拷贝到新的新空间,然后释放旧的空间,同时返回新的空间的起始地址

realloc函数不会初始化空间

9.注意好用动态内存分配函数时,要在后边做好

if (p == NULL)

{

perror("realloc");

return 1;

}

类似的工作

10.对动态分配的内存越界访问

对非动态分配的内存进行free函数的空间释放

对一部分动态分配的内存进行free函数的空间释放(即同一块空间的不完全释放)

对同一块动态分配的内存进行free函数的空间多次释放

都会导致程序崩掉

11.malloc/calloc/realloc 申请的空间如果不主动释放,出了作用域是不会自动销毁的

12.下边这个是传值调用

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

void func(char* p)
{
	return;
}

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

这样是传址调用

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

void func(char** p)
{
	*p = NULL;
	return;
}

int main()
{
	int a = 0;
	char* str = &a;
	func(&str);

	return 0;
}

13.可以这样打印字符数组

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

int main()
{
	char arr[] = "asdfgh";
	printf(arr);
	//输出结果:asdfgh

	return 0;
}

14.柔性数组:

结构中的最后一个元素允许是未知大小的数组,这就叫做[柔性数组成员

struct st_type
{
	int a;
	int arr[];//这个就是柔性数组

};

15. 结构中的柔性数组成员前面必须至少一个其他成员

 sizeof 返回的这种结构大小不包括柔性数组的内存

 包含柔性数组成员的结构要用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

例:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

struct st_type
{
	int a;
	int arr[];//这个就是柔性数组
};

int main()
{
	struct st_type* p = (struct st_type*)malloc(sizeof(struct st_type) + 40);
	//后边的40个字节的空间是分配给柔性数组的
	
	return 0;
}

16.上边的柔性数组也可以替换成:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

struct st_type
{
	int a;
	int* arr;
};

int main()
{
	struct st_type* p = (struct st_type*)malloc(sizeof(struct st_type));
	p->arr = (int*)malloc(sizeof(int) * 10);

	return 0;
}

17.

你可能感兴趣的:(C语言复习,算法,c++)