C语言之面试题(二)

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

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81105667