[]="";chars2[]="HelloWorld";(Hello和World之间是一个空格)char*p=s2;char*r=newchar[100];请计算:sizeof(s1)=?1sizeof(s2)=?12sizeof(p)=?4sizeof(r)=?4chars3[10]={'m','o','b','i','l',};chars4[20]={'A','N','S','I','\0','C','+','+',};请计算:strlen(s3)=?5strlen(s4)=?4voidFunc(charstr[100]){请计算:sizeof(str)=?4但是有一点要注意,在这个函数中,strlen(str)的结果是未定义。因为strlen是计算一个字符串的实际长度,其代码实现是寻找该字符串中的\0的位置。\0之前的就算实际长度。但是str被初始化了吗?不知道。如果被初始化了,\0的位置确定,通过寻找\0的位置,可以知道有多少个有效字符;但是如果str没有被初始化,没有\0,strlen函数就失效了,计算不出来有多少个有效字符。}:voidGetMemory(char*p,intnum){p=(char*)malloc(sizeof(char)*num);}voidTest(void){char*str=NULL;GetMemory(str,100);str仍然为NULLstrcpy(str,"hello");运行时出错cout<<str<<endl;}请问运行Test函数的结果如何?毛病出在GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p。如果函数体内的程序修改了_p指向的内容,就导致参数p指向的内容做了相应的修改(因为它们指向同一块内存空间)。这就是指针可以用做输出参数的原因。但是在本题中,_p申请了新的内存,只是把_p本身的值改变了,即指向了新的内存空间,但是p本身丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。voidGetMemory2(char**p,intnum){*p=(char*)malloc(sizeof(char)*num);}voidTest2(void){char*str=NULL;GetMemory2(&str,100);strcpy(str,"hello");cout<<str<<endl;}请问运行Test2函数的结果如何?输出hello,但是有内存泄露。使用指向指针的指针,用于在子函数中修改指针的值。char*GetMemory3(intnum){char*p=(char*)malloc(sizeof(char)*num);returnp;}voidTest3(void){char*str=NULL;str=GetMemory3(100);strcpy(str,"hello");cout<<str<<endl;}请问运行Test3函数的结果如何?输出hello,但是有内存泄露。使用函数返回值来传递动态内存,这种方法比使用指向指针的指针或者指针的引用容易理解。char*GetString(){charp[]="helloworld";returnp;}voidTest4(void){char*str=NULL;str=GetString();str的内容是垃圾cout<<str<<endl;}请问运行Test4函数的结果如何?不要用return语句返回指向栈内存的指针或引用,因为该内存在函数结束时将自动释放。Str的数值在调用GetString后不再为NULL,但是所申请的内存没有了。char*GetString2(){char*p="helloworld";//这里面有个C++对C的豁免权问题。在这句话里面,"helloworld"是个常量字符串,其数值不能被修改。如果有个指针指向该字符串,也不能修改其数值。因此,该指针应该被定义为constchar*p。但是,世界上先有的C,后有的C++。C里面有大量的char*p="helloworld";这种写法,而C++需要对C兼容。因此,在这个问题上,C++对C进行了特别豁免。如果我们试着写下如下代码:p[0]=’a’;运行时会出错的。returnp;}voidTest5(void){char*str=NULL;str=GetString2();cout<<str<<endl;}请问运行Test5函数的结果如何?输出hello,不会出错,但是不提倡这样用。函数GetString2内存的"helloworld"是常量字符串,位于静态存储区,它在程序生命期内始终有效。无
C++考卷及答案 来自淘豆网m.daumloan.com转载请标明出处.