c/c++面试踩坑笔记

各种类型内存占用

分32位和64位

32位(内存字节)

char(1)

short(2)

int(4)

long(4)

long long(8)

float(4)

double(8)

long double(8(vs)/12(gcc))

size_t/ssize_t(4)

所有指针(4)

64位

char(1)

short(2)

int(4)

long(8)

long long(8)

double(8)

long double(8(vs)/16(gcc))

size_t/ssize_t(8)

所有指针(8)

以上所有无符号和有符号占用一样

堆和栈区别

堆和栈都是在内存上面分配空间,区别:

管理方式

栈:系统分配内存,自动回收

堆:手动分配,手动释放

内存大小

栈的内存空间小,固定受限

堆的空间大,几乎受限于整机内存大小

分配方式

栈:连续内存,向下增长

堆:零散内存,向上增长

访问速度

栈快,堆慢

生命周期

栈随函数调用/结束自动存亡

堆由代码控制生命周期

cin,get,getline区别

cin

c++的输入函数,读取输入,遇到空格或者\n就会停止比如

hello world,就只会读取到hello,末尾有\n会保留在缓冲区中。

get

无参的时候读取单个字符,包括换行空格。有参的时候读取一行,遇到\n停止,\n保留在缓冲区。

getline

读取一行,遇到\n停止,\n会读出来丢掉

getline(cin,str)

c++专属,整行读取,不限定长度,string自动扩容,遇到换行停止,\n自动丢弃。

get和getline区别

就是\n,get会不动他,getline会读取出来丢掉

坑点

cin和get/getline混用的时候比如:

cpp 复制代码
char str[100];
cin>>a;
cin.get(str,100);

cin了以后缓冲区中会残留\n,get或者getline看到\n会直接停止了,那么怎么解决这个问题呢,书上是在cin了以后调用一次get把\n吃掉,我网上查还有用ignore清掉残留。

string内存坑点

string是c++的变量类型,string的结构是指针+容量+大小+内部短字符缓冲区。

sizeof 测量的是string对象本身的大小,64位sizeof(str)=32字节,32位sizeof(str)=24字节,与存放的字符串长度无关。如果字符串<=15个字符,会存放到对象本身,如果>15个字符,会额外在堆上开辟空间存储len+1,但不影响sizeof(str)。

这里又区分c和c++

c的字符串char* p和char p\[\]

sizeof(p)=8,因为p是指针,不是内容,测量的指针在64位中就是8字节

char p\[\]="abc",数组大小=len+1,字符串末尾会有\0,len是字符个数。

c++的string操作更方便,c语言的两个字符串之间不能直接赋值,类似于数组,要循环加入,或者cstring中的使用strcpy复制或者使用strcat附加实现。而string支持直接赋值,拼接,附加。

另外size和length函数没有区别,返回的都是字符个数(去掉\0后的)

结构体坑点

c和c++的结构体差不多,但是有区别,c++的结构体可以放string类型(c++的专属)以及c++的结构体可以放成员函数,但是放了成员函数就和类没啥区别了。

枚举量坑点

枚举量enum只有赋值运算符没有算数运算符如++,但如果运算的值是有效的可以强制转换

常指针与指针常量

类型用模板T代表

指向常量的指针,用 const T *p或T const *p表示,是一个指针指向一个常量,指针的地址可以改变,但是他所指向的地址存的值不可以改变。

常指针,用 T *const p表示,表示常量指针类型,指针指向的地址不可以改变,但是指向的地址所存的值可以改变

指向常量的常指针,用 const T *const p表示,这种指针指向固定地址,并且该地址存的值也是固定不变的。

相关推荐
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4563 天前
C++进阶(1)——前景提要
c++
夜悊3 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴3 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0014 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0064 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
Luminous.4 天前
C语言--day30
c语言·开发语言
玖玥拾4 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽4 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言