c语言笔面试题错题解析3

1.下面两个结构体在#pragma pack(4)和pragma pack(8)的情况下,结构体的大小分别是:

struct One

{

double d;

char c;

int i;

}

struct Two

{

char c;

double d;

int i;

}

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。 

每个特定平台上的编译器都有自己的默认“对齐系数”(32位机一般为4,64位机一般为8)。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就

是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。 

struct 或者 union 成员对齐规则如下: 

1. 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐; 

2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行; 

3.先局部成员对齐,然后再全局对齐。

实际占位用1表示,补位用0表示

#pragma pack(4)                                                                           

One的大小:                                                                                  

1111    d                                                                                                        

1111    d

1000    c

1111     i

共4+4+4+4=16

Two的大小:

1000     c

1111     d

1111     d

1111     i

共4+4+4+4=16

#pragma pack(8)

One的大小:

1111 1111           d

1111 1000            c占一位,i紧挨着占4位,再补3位对齐

共8+8=16

Two的大小:

1000 0000            c

1111 1111            d

1111 0000            i

共8+8+8=24

所以结果为16 ,16,16,24。

2.下面哪种C/C++分配内存的方法会将分配的空间初始化为0?

A  malloc()

B calloc()

C realloc()

D new()

(1)malloc 函数: void *malloc(unsigned int size) 

    在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。 

(2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 

        按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。 

        calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。 

(3)realloc 函数: void *realloc(void *ptr, unsigned int size) 

       动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。 

       申请的内存空间不会进行初始化。

(4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分

       配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。

      所以是calloc。

3.开发c代码时,经常见到如下类型的结构体定义:

    typedef   struct  list_t

{

   struct list_t   *next;

   struct list_t   *prev;

   char  data[0];

} list_t;

请问在32位系统中,sizeof(list_t)的值为?

柔性数组:把单一元素数组放在一个struct 的尾端,使得每个struct对象可以拥有可变大小的数组。

开始题目中的char data[0]或写成char data[],即为柔性数组

data不占用struct的空间,只是作为一个符号地址存在。因此sizeof的值是两个指针所占的字节。

4.下面程序出错在什么阶段?

#include <iostream>

using namespace std;

int main(int argc,char * * argv)

{

cout<<"welcome to sogou<< endl;

return 0;

}

main函数可以接受两个参数int main(int argc,char *argv[]),argc=arguments count表示参数个数,argv=argument

vector表示数组指针,同时数组在参数传递时会转义为指针,即使[]中包含维度也会被忽略!所以char *argv[]等价于

char **argv。“welcome to sogou"是以‘\0'结尾的字符常量数组,可以直接输出。所以程序正确。




 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值