思索了几个C&C++实习生面试题

本文解析了C/C++中的五个面试题目,涵盖指针、内存空间、实践应用及std::vector的深入理解,旨在帮助读者掌握核心概念并提高编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


近期公司招C/C++实习生,看了一下公司面试题。觉得题目考点太偏向概念、语法题。缺少一些基本原理和实践题。
特意思索了5题。前3题关于指针/内容空间。后2题关于实践。

如有雷同,纯属巧合

题一

在C/C++中,以下代码的执行结果

char*  str = "abcd";
str[0] = '1';

答:题中str的声明类型是char*,实际是字符串常量指向的内存空间不可写。另外,严格来说char*是个指针并不是内置字符串类型,在C++中内置字符串类型是std::string

题二

小端字节序下,printf的打印结果是

int main()
{
    short v = 0x1234;
    char* p = (char*)&v;
    printf("%x\n", *p);
    return 0;
}

答:将低位字节在低地址的称作小端字节序。题中0x12在高字节位,0x34在低字节位。

题三

执行以下代码打印结果是?

#include <stdio.h>
void swap(int* pLeft, int* pRight)
{
    // 交换指针
    int* tmp =pLeft;
    pLeft= pRight;    
    pRight = tmp;  
}
int main()
{
    int left = 1;
    int right = 2;
    int* pLeft = &left;
    int* pRight = &right;
    swap(ptrLeft, ptrRight);
    printf("left = %d, right = %d\n", *pLeft, *pRight);
   return 0;      
}

答:C/C++中指针类型与基本数据类型一样属于值类型,指针以值类型传递给函数,传递前后的这两个指针值没任何关系,只不过它们共同指向同一个空间(*操作符)。所以swap函数内交换指针,并不会交换指向的空间。

题四

std::cout的打印结果?

#include <iostream>
#include <vector>
/*批量删除下标元素*/
void remove(std::vector<int>& vec, int indexs[], int indexsSize)
{
    // 遍历要删除的下标
    for (inti = 0; i < indexsSize; ++i)
    {
         int realIndex = indexs[j])
         vec.erase(vec.begin() + realIndex);
     }
}
int main()
{
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    
    int indexs[2] = {0, 1};
    remove(vec, indexs, 2);
    std::cout << vec[0] << std::endl;
    return 0;
}

答:遍历(读)集合时增加/删除(写)元素,操作不当对结果有很大影响。众所周知std::vector的存储结构是线性空间,删除下标0的元素,会使原来下标1的元素调整到下标0。这种素的情况下,使用倒序遍历删除元素更为安全。

题五

写出以下代码的打印结果

 //1
 vector<char> vc;
 vc.reserve(5);
 vc.resize(3);
 char* pbuf = &vc[0];
 char szT[] = "abc";
 memcpy(pbuf, &szT, sizeof(szT));
 printf("%s\n", pbuf);
 vc.push_back('d');
 vc.resize(5);
 printf("%s\n", pbuf);
 vc[4] = 'e';
 printf("%s\n", pbuf);
 vc.push_back('f');
 printf("%s\n", pbuf);
 //2
 struct stTa
 {
  char a = '1';
  char b = '2';
  char c = '3';
  char d = '4';
  char e = '5';
 };
 pbuf = &vc[0];
 printf("%s\n", pbuf);
 stTa* psta = new ((stTa*)pbuf)(stTa);
 printf("%s\n", pbuf);
 *((char*)(psta + 1)) = '6';
 printf("%s\n", pbuf);

答:考察std::vector的熟练运用和其内部线性空间的分配、释放逻辑

  1. reserve(n),会将未使用的空间初始化为0。
  2. resize(n),会强制将当前下标位置修改到n。
  3. push_back(v),如果超出reserve(n)的大小,会重新分配空间。在例1开头记录pbuf = &vc[0];在执行vc.push_back('f');后会变成野指针。所以例2开头再重新获取。


原文:

https://lizijie.github.io/2019/09/11/C++不应该有垃圾回收.html


作者github:

https://github.com/lizijie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值