从零开始学习C++(十五.指针面试题探究)

351 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

前言

上篇文章看了下指针与引用的关系,今天分析几个关于C++指针的面试题,在网上查资料的时候看到的,挺有意思,两个简单的例子

1.下面的输出的内容是什么?

 int a[5]={1,2,3,4,5};
 int *ptr=(int *)(&a+1);
 printf("%d,%d/n",*(a+1),*(ptr-1));

分析: 第一行a是一个长度为5的数组
第二行&a是数组指针,&a+1就是先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址,a是一个数组,&a是一个数组引用,数组引用怎么能+1呢?&a+1=&a+sizeof(5int),&a+1指向的地址为&a[5],就是5.数组最后一个元素。(int )的意思是把这个&5[5]显式类型转换为int类型的地址intptr=(int)(&a+1),不再是内存地址;
第三行,*(a+1)中把a当成一个指针,a+1=a+sizeof(int),a+1指向a的下一个整形地址既&a[1]。 *(ptr-1)的值即为a[4]=5
结果就是2,5

2.比较分析两个代码段的输出,错误点在哪里?

char * getMemory()
{
    char p[] = "hello";
    return p;   
}

void Test(void)
{
    char *str = NULL;
    str = getMemory();
    printf(str);
}
void getMemory(char * p)
{
    p = (char*)malloc(100);
}

void Test(void)
{
    char *str = NULL;
    getMemory(str);
    strcpy(str,"hello");
    printf(str);
}

第一段代码顶一个另一个空指针,让空指针指向了一个临时变量p,临时变量随着函数调用结束而销毁,打印已经销毁的内容就会输出乱码:

image.png 经典的报错,锟斤拷烫烫烫,是一种GBK字符集和Unicode字符集之间的转换问题。这种报错编译时不会被编译器检查出来。

第二段代码 malloc用户申请一个内存空间并返回一个指向它的指针。但实际情况就是申请后就会随着函数销毁,*str还是一个空指针,赋值一个字符串给他就会报错,内存地址不能释放,导致内存泄漏。

总结

面试题总是会从一些非常基础非常细节非常重要的知识点入手,的确有点烧脑筋,要深刻理解原理才能融会贯通。