今天去了擎朗智能面试,面试问到了很多指针的题,整理一下。
1.下面程序有没有错,有的话是什么错?
void test()
{
char* str ="Linux";
*str = 'T';
printf("%s", str);
}
在c++中,vs2019中将“linux”初始化char*会报错,“linux”是const char*不能转为char*
改正的话,先将“linux”保存在一个数组中,用指针指向这个数组。如下所示,则会有如下输出:
void test()
{
char temp[]="Linux";
char* str = temp;
*str = 'T';
printf("%s", str);
}
2.strcpy()函数中如果拷贝的字符串没有那么大的内存空间会怎么样?比如下面这个例子:
void test()
{
char temp[]="Linux";
char* str;
str = (char*)malloc(1);
char aa[]="hello word";
strcpy(str, aa);
printf("%s", str);
}
用vs2019进行了测试,会输出hello word但是会报错,显示已引发异常,触发一个断点。
3.下面的程序将会输出什么?
void test()
{
char aa[]="hello word";
strcpy(str, aa);
free(str);
if (str != NULL)
{
printf("%s", "biubiubiu");
}
}
会输出
因为free释放掉str所指向的内存后,如果没有将str指向NULL,那么str仍然指向原来的内存,只不过原来内存中的东西被释放掉了,内存的所有权也已经被系统回收。这时候再打印str中的内容,将会是不确定的,可能有些编译器仍然将原来的数据保存下来了,这时候我们仍能够打印出hello word,也有可能里面的东西被释放掉了,这时候再打印可能就是乱码,但如果再往str里写入数据,仍然是能够写入的,如再往str所指向的地址复制一串字符串:
void test()
{
char aa[]="hello word";
char bb[] = "ahhhh";
strcpy(str, aa);
free(str);
strcpy(str, bb);
printf("%s", str);
cout << endl;
if (str != NULL)
{
printf("%s", "biubiubiu");
}
}
仍然是能够实现的,只不过系统再进行其他操作的时候可能也会用到p这一块内存,这时候p中原有的数据就会被覆盖掉,也可能造成内存溢出。因此,我们释放掉内存后,最好能够将原来指向这块内存的指针指向NULL,防止为以后的编程带来麻烦。
还有一些题想不起来了,整体来说更偏向字符串和内存分配方面的内容。