牛客 题库 4 内存管理GetMemory

1. 下面程序段的输出结果是()
    char c[5] = {'a','b','\0','c','\0'};
    printf("%s", c);
解答:ab
%s 为输出字符串,遇到'\0'结束
#include <iostream>
using namespace std;

int main(void) {
	char c[5] = { 'a', 'b', '\0', 'c', 'd' };
	printf("%s\n", c);
	cout << c << endl;
	return 0;
}

cout也是遇到'\0'就结束
链接:https://www.nowcoder.com/questionTerminal/82eb89630bd648d195bf46acc46ea6a5
来源:牛客网

void getmemory(char *p)
{
    p=(char*)malloc(100);
}
void test(void)
{
   char * str = null;
   getmemory(str);
   strcpy(str,”hello,world”);
   printf(str);
}

请问运行test函数会有什么样的结果? 

解答:
  • segmentation fault
正确代码如下:

#include <iostream>
using namespace std;
/***************内存管理GetMemory************************/
void getmemory(char **p)
{
	*p = (char*)malloc(100);//给p所指向的str分配了内存
}
int main()
{
	char *str = NULL;
	getmemory(&str); //&str是指针的地址,将指针的地址传给形参p,则p也指向str,
	strcpy(str, "hello, world");
	printf(str);
	return 0;
}

3.下面程序段的输出结果是
链接:https://www.nowcoder.com/questionTerminal/290f95b685dc4a1f8d316d6447fe7529
来源:牛客网

char *p1 = ”123”, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printf(“%s\n”, str);

解答:出错
链接:https://www.nowcoder.com/questionTerminal/290f95b685dc4a1f8d316d6447fe7529
来源:牛客网

原代码有错p1和p2都指向常量字符串,在常量区,所以不能对其进行操作;改为数组即可,但是用字符串初始化
数组时要记得将数组长度加1 因为字符串默认的末尾有一个‘\0’;第二点要注意的是,strcat函数的p1要有足够的
空间来容纳p1和p2连接后的串长。
正确代码如下:
#include <iostream>

using namespace std;

int main()
{
	//char *p1 = "123", *p2 = "ABC", str[50] = "xyz";
	//声明字符串指针p1,p1和p2都指向常量字符串,在常量区,所以不能对其进行操作;改为数组即可,
	char p1[10] = "123", p2[] = "ABC", str[50] = "xyz";
	
	strcpy(str + 2, strcat(p1, p2));
	printf("%s\n", str);
}

补充:

strcat:将两个char类型连接。

 

原型

extern char *strcat(char *dest, const char *src);

功能

把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。

说明

src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针
注意:一般dest是一个字符数组,不能是字符常量,char *指针修改字符串常量中的字符会导致
Segment fault错误





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值