1.
/*定义一个函数
*参数入口,定义一个指向指针的指针,
*/
void GetMemory(char **p,int num)
{
*p=(char*)malloc(num); //在堆创建一块大小为char*num的内存,指向*p
}
int main()
{
char *str=NULL; //创建一个指针
GetMemory(&str,100); //在堆创建一块大小为400byte的内存,指向str
stycpy(str,"hello"); //往str写入“hello”
free(str); //释放内存
if(str!=NULL)
{
strcpy(str,"world");
}
printf("%s",str);
getchar();
return 0;
}
//结果是打印出world
。
//解释:free释放的是str指向的内存,而str的值仍然在。因此,free之后通常还需要 str=NULL;
//内部机制:进程中的内存管理不是由操作系统负责的,而是由库函数自己完成的,当我们malloc一块内存时,管理库向操作系统申请一块空间(可能比我们实际申请的大一点),然后在这块内存中记录一些管理信息(一般是在内存的前面),并将可用内存的地址返回。释放内存时,管理库一般不会将内存返回给操作系统,因此理论上我们是可以继续访问访问这块内存的。
2.
#include "stdio.h"
#include "string.h"
int main()
{
char temp[10];
printf("strlen:%d",strlen(temp));
printf("sizeof:%d",sizeof(temp));
}
//strlen:随机
//sizeof:10
sizeof()和初不初始化,没有关系;
strlen()和初始化有关系。
3.
char (*str)[20];//*str是一个数组指针,即指向数组的指针
char *str[20]; //===char* str[20] ==>指针数组,数组元素为指针。
4.
struct TEST
{
int a:5;
int b:2;
}
int main()
{
TEST test1;
char temp[100];
strcpy(temp,"012345789");
memcpy(&test1,tmep,sizeof(TEST));
cout << test1.a << endl;
cout << test1.b << endl;
return 0;
}
//看完下面的解释后,我们可以很清晰地得到sizeof(TEST)==4,
test1的读取四个字节为0,1,2,4,ASCII码为:00110000 00110001 00110010 00110100
a为前五位,b为之后2位。就是对00110000 前五位:10000 之后两位01.之后再(int)打印,注意符号位即可。
先讲一下结构体字节长度的问题,再看上面的问题。操作系统为了“节省时间,舍弃空间”,对内存管理采用字节对齐的方式。具体到结构体中,就是按照结构体变量中最大字节长度对齐(具体到每个类型的变量的摆放位置)。
typedef struct
{
char str;
short x;
int name;
}name1;
typedef struct
{
char str;
int num;
short x;
}name2;
//sizeof(name1)=8
因为char字节后是short字节,按照short字节对齐,又因为int字节在最后了,所以不考虑对齐的问题。因此是2+2+4=8个字节
//sizeof(name2)=12
在第二个结构中,为保证num按四字节对齐,char后必须留出3个字节;同时为保证整个结构的自然对齐(4字节对齐),在x后还要补齐2个字节,这样就是12字节。
扫描二维码关注公众号,回复:
2355131 查看本文章
在结构体中使用位域时的情况:
1.如果相邻位域字段的类型相同个,且位宽之和小于类型的sizeof大小,则后面的字段存储,直到不能容纳为止。
2.如果相邻位域字段的类型相同个,但位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
3.如果相领位域字段的类型不同,则各编译器的具体实现有差异(VC不压缩,是字节长度的单独叠加),gcc采用压缩的形式。
4.整个结构体的总大小为对齐方式的整数倍。
typedef struct
{
char a:4;
char b:3;
char c:5;
}TEST
//都是char类型,a和b共7位,所以放在一个字节中,而c单独一个字节。
//sizeof(TEST)==2
typedef stryct
{
char a:4;
int b:4;
}TEST2;
//sizeof(TEST2)==5