C++的一些小问题(一)

char a[]="liuj";定义的是一个字符串,字符串后面以'\0'结尾,所以 sizeof(a)=5

char b[]={'l','i','u','j'};定义的是一个字符数组,所以sizeof(b)=4

在c语言中,字符串和字符数组都可以用a[0],a[1]……来调用其中的某个元素。而在perl中,字符串标量$a="liuj",是无法用下标来访问的。如果一定想访问的话,可以用split("",$a)把字符串一个一个的分开。

CString类的应用是因为开始c++还没有确定标准,有标准后就开始使用string类。使用string类要记得加上头文件<string>和using namespcae std; string类的赋值可以使用=直接赋值,也可以用构造函数的形式赋值str("liuj")。

Code

得到a=8,b,c,d,e=4

const 有什么用途?(请至少说明两种)

答:(1)可以定义 const 常量

(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?
答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。由于编译后的名字不同,C++程序不能直接调用C 函数。所以C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

最常见的一道c++笔试题

考察内存

void GetMemory(char *p)
{
= (char *)malloc(100);
}

void Test(void
{
char *str = NULL;
GetMemory(str);
strcpy(str, 
"hello world");
printf(str);
}

请问运行Test函数会有什么样的结果?
答:程序崩溃。
函数参数都是局部变量,改变这些参数的值不会影响调用函数中的值。局部变量被存储在栈中,函数返回时,栈被自动清空。malloc分配的内存不会被自动释放,p指向自由存储区中的内存块,离开该指针的作用域时,该内存块不会被自动归还给自由存储区。

因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。

char *GetMemory(void)
{
  
char p[] = "hello world";
  
return p;
}
void Test(void)
{
  
char *str = NULL;
  str 
= GetMemory();
  printf(str);
}

请问运行Test函数会有什么样的结果?
答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
 p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

void GetMemory2(char **p, int num)
{
*= (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(
&str, 100);
strcpy(str, 
"hello");
printf(str);
}

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

答:(1)能够输出hello (2 )Test函数中也未对malloc的内存进行释放。(3)GetMemory避免了试题1的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 p = (char *) malloc( num ); 后未判定内存是否申请成功,应加上: if ( *p == NULL ) {     ...//进行申请内存失败处理  }  

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);    
if(str != NULL)
{
  strcpy(str, “world”);
  printf(str);
}

 请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。

 指出以下代码的问题

int main()
{
  
char a;
  
char *str=&a;
  strcpy(str,
"hello");
  printf(str);
  
return 0;
}

 答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

请写出一下代码输出

Code

This is A::Func1
This is B::Func1
This is C::Func1
因为使用了虚函数,每次调用都是在运行时判断指向了哪种类型的实例。

posted on 2009-07-01 11:17  怂QQ  阅读(1680)  评论(0)    收藏  举报