今天笔试时候所遇到的题

来源:互联网 发布:淘宝俄罗斯军靴 编辑:程序博客网 时间:2024/05/15 16:13

 今天下午和同学到同洲的现场去霸面了,我把简历给软件方面的工作人员看了之后,工作人员就给了我笔试的题目,我花了1个多小时把这些题目大致做完,后面三题没有做,然后就把交到了刚给我笔试试卷的考官手中,他看了一会,说了一句,你最多能打50分,我回了一句,前面的很简单啊。他就给我分析了一下我所做的试卷,然后我才明白自己对c/c++内存这一块还是不怎么明白,虽然前几天才把书给看过了一遍。愚蒙啊

工作人员对我说,多看一下林瑞的书,我说看过了两便了,他说考前再看一遍。还让我到网上都找一些相关的题来看一下。

我刚一搜,马上搜到了下午笔试的三个一模一样的题目,现讲题目叙述如下,给各位也分享一下

第一个题:

void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}

这个题我看出来了。str1 分配了10个字节,则只能存储9各字符,最后一个用于存0.所以错了,赋值的时候错了。

void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
  str1[i] = 'a';
 }
 strcpy( string, str1 );
}

这个题考官问我的时候我看了一分钟,还是没有找出错误。汗啊

网上是这样说的。我看了也恍然大悟,汗啊

for循环对str1的赋值没有错,但是赋值完应该在字符串的最后一个字符赋0,而最重要的是strcpy这个函数的实现的具体过程是通过这个‘0’来确定赋值内存的大小的。所以,在这里不能确定str1的字节数。所以错了。

最后一个

void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
}

一开始我把strlen堪称sizeof了,后来考官就给我解释了,首先这个strlen是得到字符串的长度,不包含0,所以要通过strcpy想10个字节大小的string赋值,条件应该为strlen(str1)<10,其中有一个字节用于存结束符。

 

 

下面几个函数是经常考到的,在c程序设计语言这本书中讲到过

void strcpy(char * Dest,const char * strSrc)

{

     while((*Dest++=*strSrc++)!='/0')

;

}//

为了实现链式,则用如下方法:

char * strcpy(char * Dest,const char *strSrc)

{

   assert((Dest!=NULL)&&(strSrc!=NULL));

    char * temp=Dest;

    while((*Dest++=strSrc++)!='/0')

        ;

   return temp;

}

//适当的加assert宏和const则更好!!!!!!!!!!

 

int strlen(const char * strSrc)

{

   assert(strSrc!=NULL);

   int length=0;

 while((*strSrc++)!='/0')

 length++;

return length;

}

 

下面这几个题也是同洲笔试考到的,一模一样,汗。

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

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

// 指针传递是通过拷贝变量的副本来实现的,简单的把这个副本赋值给变量,在函数中修改了这个副本,而没有改变本身的变量地址,函数退出后,导致了原来的指针任然为NULL,则strcpy函数和printf函数都不能执行。每次都浪费一块内存。

 

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

void Test( void )
{
 char *str = NULL;
 str = GetMemory();
 printf( str );
}

这个题中在函数中定义了一个p[]的数组,讲p作为返回值返回。由于“hello world”字符串数组存储在栈中,函数退出后栈也就消失了,所以str指向的地址中的内容也就改变了。通过printf函数可以打印出来东西。但不一定是原来的内容。

 

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

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

这个函数功能没有错误,但应该在申请内存之后加上判断才好

 

void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str );
 ... //省略的其它语句
}这个函数free之后应该讲str值为NULL,而且分配之后没有判断是否成功。