标签:字典树 操作符 云上 sig 程序代码 delete start 固定 解释
struct node {
int a;
char b[0];
};
printf("%d",sizeof(node));
struct node {
int a;
char b[0];
};
printf("%d",sizeof(node));
我回答是8个字节,答案是4个字节。。。
char b[0]叫做柔性数组
b只是一个数组名,不占空间。
#include<cstdio>
#include<malloc.h>
struct node
{
int len;
int a[0];
};
int main()
{
node *p=(node*)malloc(sizeof(node)+sizeof(int)*10); //申请空间
p->len = 10;
for(int i=0; i<10; i++)
p->a[i]=i;
for(int i=0; i<10; i++)
printf("%d\n",p->a[i]);
free(p); //释放空间
return 0;
}
确认应答、超时重传、连接管理
当时就回答了1,2。
1.为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”.比如4字节的int型,其起始地址应该位于4字节的边界上.
2.便于CPU快速访问
3.32位机中CPU一次读4个字节。如果一个int起始位置在2上,CPU就要读两次,第一次读2,3位上的short,第二次读4,5位上的short,然后组合成int,如果是int在3号的位置则要3次char + short + char
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。(我没试过new分配失败会怎么样,就回答了抛异常返回null)
new/delete会调用构造/析构函数 malloc/free只是申请/释放空间
new -> operator new -> malloc
new可以被重载
云上有很多文件,对这些文件做hash得到个hash表,如果上传的文件已经在上面就不用传了。然后问我还有没有别的方法?
字典树
VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
void my_printf(char *format, ...)
{
va_list arg; //char *
va_start(arg, format);
for(int i=0;i<3;i++)
{
putchar(va_arg(arg,int));
}
va_end(arg);
}
int main()
{
my_printf("",'c','d','z');
return 0;
}
//输出cdz
对字符串format进行判断,比如%以确定有几个参数,当时也不懂c可以传...
当时大端小端都不清楚。。。后面面试官解释了下,我就说存一个int,看看可不可以取个地址输出一部分。。。
下面是正确代码,如果是输出 78 56 34 12是小端,反之为大端
unsigned int a = 0x12345678;
char *p1 = &a;
printf("%0x %0x %0x %0x",p1[0],p1[1],p1[2],p1[3]);
信号、管道、消息队列、共享内存
小端存储:低地址存放数据的高位
大端存储:高地址存放数据的高位
通行时 a主机字节序 -> 网络字节序 ->b主机字节序
网络字节序是大端,主机序是主机自己的处理数据的方式
当调用函数时,将主程序代码行的下一条指令的地址保存到栈中;当函数返回时,程序就会从栈中获取该地址,并从那一点继续向下执行。在函数调用了其它函数的情况下,将每一个返回地址都放到栈中;当函数结束时,就可以找到它们在栈中的地址。(微机课听到都还给老师了。。。当时没有回答出来)
C程序栈底为高地址,栈顶为低地址,参数入栈顺序是从右至左的。
标签:字典树 操作符 云上 sig 程序代码 delete start 固定 解释
原文地址:https://www.cnblogs.com/xcantaloupe/p/10506107.html