- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C考卷及答案C考卷及答案
char s1[] = ;
char s2[] = Hello World;(Hello和World之间是一个空格)
char *p = s2;
char *r = new char[100];
请计算:
sizeof(s1)=?1
sizeof(s2)=? 12
sizeof(p)=? 4
sizeof(r)=?4
char s3[10] = {m,o,b,i,l,};
char s4[20] = {A,N,S,I,\0,C,+,+,};
请计算:
strlen(s3)=?5
strlen(s4)=?4
void Func(char str[100])
{
请计算:sizeof(str)=?4
但是有一点要注意,在这个函数中,strlen(str)的结果是未定义。因为strlen是计算一个字符串的实际长度,其代码实现是寻找该字符串中的\0的位置。\0之前的就算实际长度。但是str被初始化了吗?不知道。如果被初始化了,\0的位置确定,通过寻找\0的位置,可以知道有多少个有效字符;但是如果str没有被初始化,没有\0,strlen函数就失效了,计算不出来有多少个有效字符。
}
关于内存的问题:
void GetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char)*num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str,100); str仍然为NULL
strcpy(str,hello); 运行时出错
coutstrendl;
}
请问运行Test函数的结果如何?
毛病出在GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p, 编译器使_p=p。如果函数体内的程序修改了_p指向的内容,就导致参数p指向的内容做了相应的修改(因为它们指向同一块内存空间)。这就是指针可以用做输出参数的原因。但是在本题中,_p申请了新的内存,只是把_p本身的值改变了,即指向了新的内存空间,但是p本身丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
void GetMemory2(char **p,int num)
{
*p = (char*)malloc(sizeof(char)*num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(str,100);
strcpy(str,hello);
coutstrendl;
}
请问运行Test2函数的结果如何?
输出hello,但是有内存泄露。使用指向指针的指针,用于在子函数中修改指针的值。
char *GetMemory3(int num)
{
char *p = (char*)malloc(sizeof(char)*num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str,hello);
coutstrendl;
}
请问运行Test3函数的结果如何?
输出hello,但是有内存泄露。使用函数返回值来传递动态内存,这种方法比使用指向指针的指针或者指针的引用容易理解。
char *GetString()
{
char p[] = hello world;
return p;
}
void Test4(void)
{
char *str = NULL;
str = GetString(); str的内容是垃圾
coutstrendl;
}
请问运行Test4函数的结果如何?
不要用return语句返回指向栈内存的指针或引用,因为该内存在函数结束时将自动释放。Str的数值在调用GetString后不再为NULL,但是所申请的内存没有了。
char *GetString2()
{
char *p = hello world;//这里面有个C++对C的豁免权问题。在这句话里面,hello world是个常量字符串,其数值不能被修改。如果有个指针指向该字符串,也不能修改其数值。因此,该指针应该被定义为const char *p。但是,世界上先有的C,后有的C++。C里面有大量的char *p = hello world;这种写法,而C++需要对C兼容。因此,在这个问题上,C++对C进行了特别豁免。如果我们试
文档评论(0)