C++题目

问答题

分析代码

1分析下面代码有什么问题?
void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
 str1  = 'a';
 }
strcpy( string, str1 );
}

answer:

首先,代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。

再者,即使想对数组的第一个元素赋值,也要使用 *str1 = ‘a’;

其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到’’为止。所以拷贝的长度是不定的。如果一直没有遇到’’导致越界访问非法内存,程序就崩了。

完美修改方案为:

void test2()
{
    char string[10], str1[10];
    int i;
    for(i=0; i<9; i++)
    {
        str1[i]  = 'a';
    }
    str1[9] = '';
    strcpy( string, str1 );
}
2指出下面代码有什么问题?
void test3(char* str1)
{
 if(str1 == NULL){
        return ;
 }
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
 strcpy( string, str1 );
 }
}

answer:

if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’’所占用的1个字节。

3看看下面的一段程序有什么错误?
swap( int* p1,int* p2 )
{
 int *p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
}

answer:

1.需要一个返回值void

2在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:

void swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}

id swap( int* p1,int* p2 )

{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}

原文地址:https://www.cnblogs.com/coding365/p/12872277.html