#include<stdio.h>
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(
int
argc,
char
**argv)
{
printf(
"%s\n"
, myString());
return
0
;
}
解析:
答案:D 函數char *myString()中沒有使用new或者malloc分配內存,所有buffer數組的內存區域在棧區 隨著char *myString()的結束,棧區內存釋放,字符數組也就不存在了,所以會產生野指針,輸出結果未知 2. 1 2 3 4 5 6 7enum
string{
x1,
x2,
x3=
10
,
x4,
x5,
} x;
問x等於什麼?(0)
在c語言中,這樣寫法一般是全局變量,程序初始化時會清零.
3.
設已經有A,B,C,D4個類的定義,程序中A,B,C,D析構函數調用順序為?
1
2
3
4
5
6
7
8
C c;
void
main()
{
A*pa=
new
A();
B b;
static
D d;
delete pa;
}
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)的值是多少(12)?
(2)若按1字節對齊sizeof(CTest)的值是多少(9)?
請選擇正確的答案。
解析:
答案分別是:12 和 9,對應C
考察點:c++ 類的內存布局。
上精華圖:一張圖說明類中成員變量,成員函數,靜態變量與函數的空間位置。
理論如上,下面就是代碼運行後真是執行結果。無pp無真相。這是4字節對齊,結果是12= 4(虛表指針)+1(char )+3(對齊補位)+4(int)
以下是1字節對齊,結果是9 =4(虛表指針)+1(char )+4(int)
5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
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
;
}
運行時的輸出結果是()解析:首先程序中存在三個MyClass對象。
前兩個對象構造時分別輸出1,2
第三個對象是這樣構造的MyClass obj3 = obj1;這裡會調用拷貝構造函數,輸出2
然後三個對象依次析構,輸出444
所以最終輸出122444
MyClass obj3 = obj1;這裡調用拷貝構造函數
如果是在這之前obj3,obj1都已聲明,則此時調用的是coby assignment操作符