1 char *p = "hello world"; p存储在() //堆栈
char p[ ] = "hello world"; p存储在() //堆栈
全局变量 //数据段
static变量 //数据段
分别在哪个地方?
1. 数据段 2. 代码段 3. 堆 4. 堆栈
笔记:
int a = 0; //全局数据区
char *p1; //全局数据区,分配该区时内存全部清零
main() {
int b; 栈
char s[ ] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; // 全局数据区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在自由数据区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456" 优化成一个地方。
}
总结:
五大内存分区 :
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
2. % & . && <= = 那个优先级别最高
. & % <= && =
3. 以下哪些通信方式是可靠的通讯方式 (1)信号 (2)管道 (3)消息 (4)tcp (5)udp (6)串口I/O
4.(M)?(a++):( a--),此处的M与下面哪一项是等价
A,M==O,B,M==1,C,M!=O,D,M!=1
5. Unix的启动顺序?
UNIX系统的启动过程如下:
1 用户打开计算机电源。
2 计算机自动执行ROM引导程序。
3 将第一块硬盘的boot区调入内存并执行。硬盘的boot区存有硬盘的分区信息和驱动程序。
4 将硬盘的活动分区上的bootstrap程序调入内存并执行。bootstrap程序位于该活动分区上的第0号块中。
5 将UNIX的启动程序/boot调入内存并执行。
6 将UNIX的内核程序/unix调入内存并执行。
7 检测并配置内存和硬件设备。
8 启动/etc/init进程。init将/etc/inittab调入内存,并根据启动层次的不同,选择/etc/inittab内不同的程序来执行。对于多用户来说,init会执行/sbin/bcheckrc和/sbin/brc进程,最后由/sbin/rc2进程将系统带入多用户使用环境,并为每个终端启动/etc/getty一个进程等待接收用户的登录。
6. 数制转换151转2进制和九进制
10010111,177
· 有一个数组a[0] 到 a[i-1]为从小到大排序,a[i]到a[count-1]没有排序,请您添加3条语句使它们按照从小到大排序。
int insert_sort(int a[],int count)
{
for(int i=1;i (j=i-1;)
while(j>=0&&t (a[j+1]=a[j];)
j--;
}
(a[j+1]=t;)
}
return 0;
}
12. VC中有哪些方法避免C编程中的头文件重复包含:
1).
#ifndef !!!!
#def !!!!
#endif
2).extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
extern "C"是链接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和链接的。
14. 编程中异步IO和同步IO有什么区别?说说你可知道的几种IO?
简单的说“同步IO在编程里,一般是指某个IO操作执行完后,才可以执行后面的操作。异步IO则是,将某个操作给系统,主线程去忙别的事情,等内核完成操作后通知主线程异步操作已经完成。”15. 使用异步socket编程,通常因为网络拥塞send不出数据,会获得什么样的错误码(windows下举例),通常如何处理这种情况?
非阻塞SOCKET,SEND不出数据的原因有2个吧,TCP下连接断开了和该SOCKET处在阻塞状态(也就是说在发送数据中)。UPD发不出只有TCP后面的情况。
处理的办法就是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。
16. 在vc中怎样解决内存泄漏的问题(release版本)
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
#include
#pragma pack(2)
struct X{
char a;
int b;
double c;
};
int main()
{
X x;
std::cout << sizeof(x) << std::endl;
return 0;
}
#include
#pragma pack(4)
struct X{
char a;
int b;
double c;
};
int main()
{
X x;
std::cout << sizeof(x) << std::endl;
return 0;
}
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。
#include
using namespace std;
void itoa(int i,char* string)
{
int flag = 0;
if(i<0)
{
string[flag++] = '-';
i = -i;
}
int j = i;
int pow;
for(pow=1;j>10;j/=10)
{
pow *= 10;
}
cout << pow << endl;
for(;pow>0;pow/=10)
{
string[flag++] = '0' + i/pow;
i%=pow;
}
string[flag++] = '\0';
}
int main()
{
char s[10];
itoa(1234,s);
cout << "s=" << s << endl;
}
#include
using namespace std;
int atoi(char* s)
{
if(!s)
return -1;
int res = 0;
bool fushu = false;
int flag = 0;
if(*(s+flag)=='-')
{
fushu = true;
flag++;
}
vector temp;
while(*(s+flag)!='\0')
{
if(*(s+flag)>='0' || *(s+flag)<='9' )
{
temp.push_back(*(s+flag)-'0');
flag++;
}
else
return -1;
}
int pow = temp.size()-1;
for(int i=0;i
19. 异步socket编程中,send不出数据的错误码是什么,(举Linux或Windows为例),你是怎么处理的?
非阻塞SOCKET,SEND不出数据的原因有2个吧,TCP下连接断开了和该SOCKET处在阻塞状态(也就是说在发送数据中)。UPD发不出只有TCP后面的情况。
处理的办法就是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。