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<count;++i) { int j,t; t=a[i]; (j=i-1;) while(j>=0&&t<a[j]) { (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 <bits/stdc++.h>#pragma pack(2)struct X{ char a; int b; double c;};int main(){ X x; std::cout << sizeof(x) << std::endl; return 0;}
首先系统会将字符型变量a存入第0个字节(相对地址,指内存开辟的首地址);然后在存放整型变量b时,会以2个字节为单位进行存储,由于第一个二字节模块已有数据,因此它会存入第二个二字节模块,也就是存入到2~5字节;存放双精度实型变量c时,由于其宽度为8,其存放时会以2个字节为单位存储(2和8的最小值是2),也就是会找到第一个空的且是2的整数倍的位置开始存储,将c存入第四个2字节模块。总共14个字节,正好是二字节(#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个)的整数倍。
#include <bits/stdc++.h>#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 <bits/stdc++.h>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 <bits/stdc++.h>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<int> 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<temp.size();i++) { res += temp[i]*10^pow; pow--; } return fushu?-res:res; }int main(){ cout << atoi("-1234") << endl;}
19. 异步socket编程中,send不出数据的错误码是什么,(举Linux或Windows为例),你是怎么处理的?
非阻塞SOCKET,SEND不出数据的原因有2个吧,TCP下连接断开了和该SOCKET处在阻塞状态(也就是说在发送数据中)。UPD发不出只有TCP后面的情况。
处理的办法就是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。
20. new和malloc,free和delete的区别
点击打开链接