嵌入式软件开发试题——供自己查漏补缺(不断更新)

一点声明:

本试题整理供本人查漏补缺,题目来自网络,如有侵权,请联系作者删除;若有错误,请不吝指出,万分感谢。

目录

找错题

简答题


 

找错题


试题1

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

 

答案:

字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界。


试题2

void test2()

{

    char string[10], str1[10];

    int i;

    for(i=0; i<10; i++)

    {
    
        str1[i] = 'a';

    }

    strcpy( string, str1 );

}

 

 

答案:

str1在数组内没有结束的标志’\0’, 当调用strcpy时,并不确定从复制了多少字节的数据到string开始所在内存上面,可能会破坏string数组后面内存中的数据。

/*strcpy的实现代码*/

char* strcpy(char* des, const char* source)

{

    char* r = des;

    assert((des != NULL) && (source != NULL));

    while((*r++ = *source++) != ‘\0’);

    return des;

}

试题3

void test3(char* str1)

{

    char string[10];

    if( strlen( str1 ) <= 10 )

    {

        strcpy( string, str1 );

    }

}

 

答案:

if(strlen(str1) <= 10) 应改为 if(strlen(str1) < 10),

因为strlen调用的结果并未统计’\0’所占用的1个字节。

注:

//strlen C语言函数实现
int strlen(const char* str)
{
    assert(str != NULL);
    
    int len = 0;
    
    while((*str++) != '\0' )
        len++;

    return len;
}

试题4:

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

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

答案:

GetMemory函数的形参是字符串指针,在函数里面改变形参的值并不能真正改变传入形参的值。

执行完char *str =NULL; GetMemory(str); 之后,str仍然指向NULL。


试题5:

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

void Test( void )
{
    char *str = NULL;
    str = GetMemory();
    printf( str );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值