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表示,这种指针指向固定地址,并且该地址存的值也是固定不变的。

相关推荐
CHHH_HHH10 分钟前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发29 分钟前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
jimy12 小时前
C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体
c语言·开发语言
三品吉他手会点灯3 小时前
嵌入式机器学习 - 学习笔记1.1.1 - 什么是机器学习?
c语言·人工智能·笔记·嵌入式硬件·学习·机器学习
旖-旎3 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
QN1幻化引擎3 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏4 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
小樱花的樱花4 小时前
Linux 线程的创建
linux·c语言·开发语言
c238565 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练:【二分答案】案例2:木材加工
c++·二分答案·csp·高频考点·信奥赛·木材加工