萌新的c语言学习-10
大小端
//实现大小端判断的方法
int panduan()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int a = 1;
int ret = panduan();
if (ret == 1)
{
printf("小段");
}
else
printf("大端");
}
//小端
//
//可以用结构体的方法因为我们公用了一个空间
//我在你取完数字之后把这个空间的值重定义会有不一样的效果
int check_sys()
{
union un
{
char c;
int i;
} u;
u.i = 1;
return u.c;
}
int main()
{
int ret = check_sys();
if (1 == ret)
printf("小端");
return 0;
}
动态内存的使用
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlib.h >
#include<stdio.h>
对内存的使用
动态内存分配
我们想要分配多大的空间就多大
malloc free calloc realloc
int main()
{
//像内存申请10个整型的空间
int* p =(int*) malloc(10 * sizeof(int));
//返回的是这个内存空间的地址
//malloc的返回类型是void* 所以需要我们进行强制类型转化
int i = 0;
for (i = 0;i < 10;i++)
{
*(p + i) = i;
}
for (i = 0;i < 10;i++)
{
printf("%d ", *(p + i));
}
//用完之后还回去就是free(p);
free(p);
p == NULL;//虽然空间被释放了,但是p还是指向这个地址,所以我们把它变成空指针
//释放掉p
return 0;
}
当然程序结束之后,这部分空间也会还回去的
calloc 在内存开辟数组空间
#include<string.h>
int main()
{
//有区别在于malloc(10 * sizeof(int))然而
int*p=(int*) calloc(10, sizeof(int));
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", *(p + i));
}
//calloc 开辟数组空间后 先全部赋值为0
//free函数是用来释放动态开辟的空间的
free(p);
p = NULL;
//calloc初始化好了 malloc速度快但是没有先初始化
return 0;
}
realloc重新开辟空间 调整动态开辟内存的大小
int main()
{
//我们先开辟一块空间
int* p = ((int*)malloc(20));
if (p == NULL)
{
printf(“%s\n”, strerror(errno));
}
else
{
int i = 0;
for (i = 0;i < 5;i++)
{
*(p + i) = i;
}
}
//截止到现在我们正在使用malloc开辟的20个字节
//假设这里的20个字节不能满足我们的使用 我们希望
//可以有40个字节的空间 这里就可以用realloc来调整动态开辟内存
//
//realloc 返回类型void 第一个参数是需要调整的目标寄存器
//size是新的大小
int*p2=realloc(p, 40);
int i = 0;
for (i = 5;i < 10;i++)
{
*(p2 + i) = i;
}
for (i = 0;i < 10;i++)
{
printf("%d ", *(p2 + i));
}
return 0;
}
0 1 2 3 4
realloc函数使用的注意事项
如果p指向的空间之后有足够的内存空间可以追加,则直接追加,后返回p
如果P指向的空间之后没有足够的内存空间可以追加,那么realloc会重新找一个新的内存区域
开辟一块满足需求的新的空间,并把原来的数据拷贝过来,释放旧内存空间
最后返回新开辟的内存空间的地址
得用一个新的变量来接受realloc的返回值
常见动态内存的错误
1…
int main()
{
int* p=(int*)malloc(40);
//万一 malloc失败了,*p就会被赋值为空指针
}
2.对于动态内存访问不能越界
3.对非动态开辟空间使用free
//当然程序结束之后,这部分空间也会还回去的
//calloc 在内存开辟数组空间
#include<string.h>
int main()
{
//有区别在于malloc(10 * sizeof(int))然而
int*p=(int*) calloc(10, sizeof(int));
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", *(p + i));
}
//calloc 开辟数组空间后 先全部赋值为0
//free函数是用来释放动态开辟的空间的
free(p);
p = NULL;
//calloc初始化好了 malloc速度快但是没有先初始化
return 0;
}
//realloc重新开辟空间 调整动态开辟内存的大小
int main()
{
我们先开辟一块空间
int* p = ((int*)malloc(20));
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0;i < 5;i++)
{
*(p + i) = i;
}
}
// //截止到现在我们正在使用malloc开辟的20个字节
// //假设这里的20个字节不能满足我们的使用 我们希望
// //可以有40个字节的空间 这里就可以用realloc来调整动态开辟内存
// //realloc 返回类型void 第一个参数是需要调整的目标寄存器
// //size是新的大小
int*p2=realloc(p, 40);
int i = 0;
for (i = 5;i < 10;i++)
{
*(p2 + i) = i;
}
for (i = 0;i < 10;i++)
{
printf("%d ", *(p2 + i));
return 0;
}
}
// 0 1 2 3 4
// realloc函数使用的注意事项
//如果p指向的空间之后有足够的内存空间可以追加,则直接追加,后返回p
//如果P指向的空间之后没有足够的内存空间可以追加,那么realloc会重新找一个新的内存区域
//开辟一块满足需求的新的空间,并把原来的数据拷贝过来,释放旧内存空间
//最后返回新开辟的内存空间的地址
//得用一个新的变量来接受realloc的返回值
//常见动态内存的错误
// 1..
int main()
{
int* p=(int*)malloc(40);
//万一 malloc失败了,*p就会被赋值为空指针
}
//2.对于动态内存访问不能越界
// 3.对非动态开辟空间使用free
//
//