C/C++技术笔试题

指针

1.what will happen after running the test?

#include <iostream>

void getMemery(char *p,int num){
	p = (char *)malloc(sizeof(char)*num);
}

int main(){
	char *str = NULL;
	getMemery(str,100);
	strcpy(str,"hello");
	return 0;
}

答案:程序崩溃。实际上分配内存的只是形参p的一个副本,函数调用结束后p又没有返回给str,strcpy的str实际上是没有分配内存。

如果想不通过返回值的方式给str分配内存,程序如下。

#include <iostream>

void getMemery(char **p,int num){
	*p = (char *)malloc(sizeof(char)*num);
}

int main(){
	char *str = NULL;
	getMemery(&str,100);
	strcpy(str,"hello");
	return 0;
}

2.这个函数有什么问题?该怎么修改?

char* fun(){
	char str[] = "hello world";
	return str;
}

答案:函数fun调用结束后,fun的栈帧被推出调用栈,str所在的内存块面临随时被其他程序使用的风险。

正确程序:

const char* fun(){
	char *str = "hello world";
	return str;
}

char str[] = "hello world";是个局部数组,分配在内存中的栈;

而char *str = "hello world";是个全局数组,分配在内存中全局区域,字符串常量保存在只读的数据段。

如果尝试修改字符串:

char *str = "hello world";
*str = 't';
运行报错。

而这样写:

char str[] = "hello world";
str[0] = 't';

就可以修改了。

如果想修改字符串,可以这样写:

const char* fun(){
	static char str[] = "hello world";
	return str;
}
通过static开辟一段静态存储空间。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值