前边的补充:数字字符转化为数字需要减去字符'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.