1. 下面描述正确的是
int *p1 = new int [10] ;
int *p2 = new int [10] () ;
A p1 和 p2 申请的空间里面的值都是随机值
B p1 和 p2 申请的空间里面的值都已经初始化
C p1 申请的空间里的字是随机值, p2 申请的空间里的值已经初始化
D p1 申请的空间里的值已经初始化, p2 申请的空间里面的数值是随机值
2. 下面的程序可以从 1...n 中随机等概率的输出 m 个不重复的数
knuth ( int n , int m )
{
srand ( (unsigned int)time(0) ) ;
for ( int i = 0 ; i < n ; i++ )
{
if (?)
{
cout << i << endl ;
(?) ;
}
}
}
A , rand() %(n-i) <= m ; m--
B , rand()%(n-i) < m ; m--
C, rand()%(n-i) >= m ; m++
D, rand()%(n-i) > m ; m++
2. 答案 B
这道题暂时没有想明白
3. enum string {
x1 ,
x2,
x3 = 10 ,
x4,
x5,
}x ;
x 的数值等于什么?
A. 5 B. 12 C. 0 D. 随机值
4.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问 p1+5 = ? p2+5 = ?
5. 在32位机器中,运行如下程序输出结果
void example ( char acWelcome[] )
{
printf ("%d" , sizeof(acWelcome)) ;
return ;
}
void main ()
{
char acWelcome [] = "Welcome to Huawei Test" ;
example ( acWelcome ) ;
return ;
}
6. void Func ( char str_arg [100] )
{
printf ("%d\n" , sizeof( str_arg) ) ;
}
int main ( void )
{
char str [] = "Hello" ;
printf ("%d\n" , sizeof(str)) ;
printf ("%d\n" , strlen ( str )) ;
char *p = str ;
printf ("%d\n" , sizeof( p ) ) ;
Func ( str ) ;
}
请问在 32 位系统下,程序输出的结果是什么?
A , 5 5 4 4 B. 6 5 4 4 C. 6 5 6 4 D. 5 5 5 100
7. 若 char 是1个字节, int 是 4 个字节, 指针类型是 4 个字节,代码如下
class CTest
{
public:
CTest() : m_chData('\0') , m_nData(0)
{}
virtual void mem_fun () {}
private :
char m_chData ;
int m_nData ;
static char s_chData ;
} ;
char CTest::s_chData = '\0' ;
请问:
1. 如果按照 4 个字节对齐 sizeof(CTest) 的值是多少 ?
2. 如果按照 1 个字节对齐, sizeof(CTest) 的值是多少?
A . 16 4 B . 16 10 C . 12 9 D . 10 10
8. #include
using namespace std ;
class MyClass
{
public :
MyClass ( int i = 0 )
{
cout << i ;
}
MyClass ( const MyClass &x )
{
cout << 2 ;
}
MyClass &operator=( const MyClass &x )
{
cout << 3 ;
return *this ;
}
~MyClass ()
{
cout << 4 ;
}
} ;
int main ()
{
MyClass obj1(1) ,obj2(2) ;
MyClass obj3 = obj1 ;
return 0 ;
}
运行时的输出结果是()
-
11214444
-
11314444
-
122444
-
123444
9 . 如下代码输出的结果是什么 ?
#include
char *myString ()
{
char buffer[6] = {0} ;
char *s = "Hello World!" ;
for ( int i = 0 ; i < sizeof(buffer) -1 ; i++ )
buffer[i] = *(s+i) ;
return buffer ;
}
int main ()
{
printf ("%s\n" , myString() ) ;
return 0 ;
}
A. Hello B. Hello World! C. Well D. 以上全部不正确
10 . 分析下列程序是否正确,如果错误指出错误原因,如果正确写出程序运行结果
#include
int a = 3 ;
int f ()
{
int a = 1 , i ;
for ( i = 0 ; i < 1 ; i++ )
{
int a = 2 ;
printf ("%d\n" , a ) ; 2
}
}
int main ()
{
f () ;
printf ("%d\n", a) ;
}
1. 答案:C
在 C++ 语言中可以将数组当做对象来看待,表达式 1 仅仅从系统的堆空间中动态申请10个连续的int 空间,
但并没有对空间中的数值进行初始化。
表达式 2 是以数组为一个对象,通过构造函数来动态申请一个长度为 10 的整型数组变量,所以空间中的数值被初始化。
3. 答案 C
在枚举变量的声明通常是在方法外面,作为全局变量而并非是局部变量。
既然是全局变量的话,在程序运行之前 x 的数值就会被初始化为 0 , 与枚举变量中的具体数值无关。
局部变量在初始化的时候会初始化为随机值
4. 答案:
这道题主要考察的是 指针 + 整型数值 N = 指针移动N*(指针指向的变量类型在系统中所占的字节数)
p1 +5 = 相当于把指向类型为 unsigned char 变量的指针移动 5 个 sizeof(unsigned char ) 个位移
sizeof( unsigned char ) = 1
p1 + 5 = 0x801000 + 5 * 1 = 0x801005
p2+5 = 相当于把指向类型为 unsigned long 变量的指针移动 5 个 sizeof ( unsigned long ) 个位移
sizeof( unsigned long ) = 4
p2+5 = 0x810000 + 4*5 = 20 转换为0x(16 进制) 为 14 = 0x810000 + 0x14 = 0x810014
5. 答案 : 4
这道题目主要考察的知识点是,在将字符串数组作为参数传递到另一个方法中的核实后,
无论方法参数是字符指针还是字符串数组,实质上在方法中都会被当做字符指针来看待,
不然为何编写以数组为参数的方法的时候,还需要另行添加一个用来表示数组长度的变量呢?
该字符串数组 acWelcome 在被传送到方法 example 中之后,便会作为一个字符指针存在。
sizeof ( 指针) = 计算机位数 / 8 = 32 位计算机 / 8 = 4 字节
指针所占字节至于计算机的位数相关,与指针指向的变量类型无关
32位计算机中,所有的指针变量所占字节都是 4
64位计算机中, 所有指针变量所占字节都是 8
6.答案:
6 5 4 4
这道题考查的知识点有
1. sizeof 与 strlen 对于字符数组的使用方法
2. 字符数组作为参数变量,在传入的方法中会被当做是字符指针
3. 指针变量字节个数只和计算机位数有关,与指针所指向的不同变量类型所占字节个数无关
sizeof (str) 会显示出字符数组变量所占的字节数,str 是一个长度为 6 的字符数组变量,所占字节个数当然为 6
strlen(str) 显示出的是该字符数组中排除 '\0' 字符的所有有效字符的个数,即 Hello 中有多少个字母
sizeof( p ) 显示出的是,字符指针在 32 位系统中所占用多少个字节? 指针在 32位系统中固定占有 4 个字节
Func ( str ) str 在被传入到 Func 方法中之后,会被视为是一个字符指针,同上,指针在当前系统中占有 4 个字节
7. 答案:C
这道题主要考察的有
1. sizeof 含义, 2. 字节对齐的概念, 3. C++ 类的内存分布
sizeof 的含义就是返回系统在创建传入参数对应的这个变量的时候,为其分配多少个字节的空间
字节对其如果当前系统是以 X 字节对其,那么把对象 CTest 所占用的字节个数通过 sizeof( CTest) 计算之后
看是否可以被 X 整除,如果可以整除,那么就说 sizeof(CTest ) 便是以 X 字节对其的。
如果不能够整除,那么就将 sizeof(CTest) +最小的一个整数, 使得 {size(CTest} + m } % X = 0
那么 sizeof(CTest) + m 便是在 以 X 字节对齐的情况下的数值。
C++对象内存分布:
对于无父类的C++ 的类而言, 如果其中没有任何成员变量,那么该 类所占用的是 1 个字节;
如果类中不定义任何的成员函数,该类占内存空间也是 1 个字节
如果类中有一个 int 类型的成员变量, 该类占用的内存空间 便是将 1 字节忽略掉,占用 4 个字节;
如果类中有虚函数,虚函数在系统中是需要为其分配额外的虚函数表, 需要一个额外的 4 个字节;
如果类中有静态变量,静态变量是在静态存储空间中被分配的,其空间的分配不会记录到该类所占空间的计算中,忽略掉。
知道了上述条件之后,我们来一起看一下, CTest 所占用的实际字节个数是多少:
1. 有虚函数: 占用 4 个字节,虚函数表会消耗 4 个字节的内存空间 ---> 4
2. 有成员变量: int char , 分别对应 4 个字节 和 1 个字节 ---> 5
3. 因为有成员变量,所以 类 需要的 1 个字节忽略不计 --> 0
4. 构造函数属于成员函数,忽略不计 ---> 0
所以 sizeof( CTest ) = 9
如果是以 1 个字节对齐的话 9%1 = 0 , 故以 1 个字节对齐占用的是 9 个字节
如果是以 4 个字节对齐 9 %4 = 5 != 0 , 所以大于 9 且可以 %4 = 0 的最小数值是 12 ,
故以 4 个字节对齐所占用的是 12 个字节。
8.答案
这道题主要的考点是,重载 “=” 运算符和拷贝构造函数的使用方法和区别
创建 obj1, obj2 两个类实例对象的时候分别调用的是 MyClass ( int i = 0 ) 构造函数
而在创建 obj3 对象的时候调用的是拷贝构造函数 即, MyClass ( const MyClass &x )
而并非是重载赋值运算符的方法, 这个是因为 该语句是 obj3 对象的创建语句。
如果obj3 在执行 obj3 = obj1; 语句之前就已经创建好了,即
MyClass obj3 ;
obj3 = obj1 ;
这样的才会调用重载的赋值号方法: MyClass &operator=( const MyClass &x )
为了避免混淆,可以这样理解 MyClass obj3 = obj1 ; 等价于 MyClass obj3 (obj1) ;
9. 答案 D
这道题目主要是考察子方法中变量空间在子方法返回之后会被系统自动释放。
在 myString () 方法中所申请存放字符串的 buffer 是局部变量,是系统从栈空间中申请的,
带到 myString () 方法结束之后,系统便会自动的释放该 buffer 所占用的空间。
所以 myString() 返回的便是一个野指针,指向空间中的数据内容未定。
如果在子方法中使用 new / malloc 系统将会从堆空间中为其分配空间资源,
该空间是需要手动调用 delete/free 方法来释放的,即便是方法结束该空间也不会被系统自动回收。
若在子方法中通过 new/malloc 为buffer 分配空间,便会在主程序中输出结果 A 选项
10.答案:输出结果是
2
3
这道题主要考察的是全局变量和局部变量的访问限制和作用域和访问就近原则
a= 3 是全局变量
a=1 是方法 f 中的局部变量
a = 2 是循环嵌套语句中的局部变量
从主函数中可以看出首先调用方法 f
会执行 f 函数中的 for 循环, 循环会执行 1 次,
就近输出 a = 2 数值
退出方法 f 之后 a = 1 , a= 2 变量空间被系统收回
接下来输出变量 a 的数值便是全局变量 a = 3 的数值了
end
阅读(1842) | 评论(0) | 转发(0) |