今天有上課了,王老師與我們分享了一些筆試容易出錯的問題,我把它總結出來與大家一起學習。
1. 求下面程序的結果:
點擊(此處)摺疊或打開
- int
main(void)
{
unsigned short A = 10;
printf("~A = %u\n", ~A);
char c = 128;
printf("c = %d\n", c);
}
運算結果:4294967285(我的機子上,short是16位的) -128
2. 求輸出結果:
點擊(此處)摺疊或打開
- void
GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
int
main(void)
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "hello");
free(str);
if( str != NULL )
strcpy(str, "world");
printf("str is %s\n", str);}運行結果:str is world
我們緊接着又給str拷貝了world,可能很多人會和我有一樣的感覺,就是這是錯誤的,明明將空間釋放掉了,怎麼能拷貝到裏面呢? 在拷貝world之前,有一條if()語句,判斷str是否爲NULL,從上面的打印結果可以看到,str並不爲NULL,所以會進行下面的拷貝語句。不過,特別要注意,打印出str is world,這完全是一個巧合,因爲我們在free與後來的拷貝之間並沒有進行新的空間申請,所以,雖然釋放了空間,但是我們可以找到地址,在這塊內存上進行復制操作。如果我們在free後,又申請了新的空間,剛剛好把這塊空間申請了,可能結果就不是我們想要的了。 我們自己平時使用時,一定要避免這種錯誤。方法是在free()後,將指針置爲NULL,這樣,由於指針爲空,所以對它進行復制操作必然會發生錯誤。
3. 求下面程序的運行結果:
點擊(此處)摺疊或打開
- int
main(void)
{
char a[10];
printf("%d\n", strlen(a));
return 0;
}
點擊(此處)摺疊或打開
- int
main(void)
{
char a[10];
int i;
for(i = 0; i < 10; i)
printf("a[%d]:%d\n", a[i]);
printf("length:%d\n", strlen(a));
return 0;
}
從運行結果可以看到,a數組中存入的值爲垃圾值。length()求的是字符串的長度,到'\0'爲止的長度。由此可知,strlen(a)的結果爲2。2是一個隨機值,每個人的機子上運行出來的結果可能都不一樣,因爲每個人機子上,數組初始化幾個元素是不定的。有的人的機子上可能會打印出大於10的值,這是因爲strlen()在求值的時候,從數組第一個元素開始查找,找到連續內存中的第一個'\0'停止,即爲strlen()的結果。 特別強調一下,如果上述strlen()換爲sizeof()的話,結果爲10。strlen()與數組的初始化有關,而sizeof()與初始化無關。
4. x = 9999, 求下面函數的返回值
點擊(此處)摺疊或打開
- int
func(int x)
{
int countx = 0;
while(x)
{
countx ;
x = x (x-1);
}
return countx;
}運行結果:8
5. 求sizeof(A) = ?(32位機)
點擊(此處)摺疊或打開
- struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};運行結果:8(gcc編譯器,版本爲4.6.3)