C語言基礎筆試題一

1.下面的代碼輸出什麼?爲何?windows

void foo(void)數組

{ide

unsigned int a = 6;函數

int b = -20;測試

(a+b > 6)?puts(「>6」):puts(「<=6」);內存

}字符串

答案:輸出值」>6」編譯器

解析:a+b在這裏作了隱式的轉換,把int轉化爲unsigned int.編譯器會把b當作一個很大的正數.string

2.下面的代碼有什麼問題,爲何?it

void foo(void)

{

    char string[10], str1[10];

    int i;

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

        str1[i] = 'a';

    }

    strcpy(string, str1);

    printf("%s\n", string);

}

答案:運行到strcpy的時候可能會產生內存異常

解析:吟哦日str1沒有\0結束標誌,因此數組後面存儲的可能不是\0,而是隨機數據,對於strcpy和printf這種須要\0判斷字符串結束的函數來講,出錯是必然的了.

道理雖是如此,可是這段代碼我在windows和Linux下測試的結果不同,Linux下能夠正常輸出10個a,windows下會出錯,使用的都是gcc的編譯器.

3.下面的代碼,i和j的值分別是多少?爲何?

static int j;

int k = 0;

void fun1(void)

{

    static int i = 0;

    i++;

}

void fun2(void)

{

    j = 0;

    j++;

}

int main(void)

{

    for (k = 0; k < 10; k++) {

        fun1();

        fun2();

    }

    return 0;

}

答案:i=10,j=1

解析:因爲被static修飾的局部變量存儲在靜態區內,因此即便這個函數運行結束,這個靜態變量仍是不會被銷燬,函數下次運行時還能使用這個值,靜態變量只被初始化一次,函數下次運行會直接跳過初始化,進行++操做.而j每次都被賦0.

4.下面的代碼裏,假設在32位系統下,各sizeof計算得結果分別是多少?

int *p = NULL;

sizeof(p)的值是

sizeof(*p)的值是

int a[100];

sizeof(a)的值是

sizeof(a[100])的值是

sizeof(&a)的值是

sizeof(&a[0])的值是

int b[100];

void fun(int b[100])

{

    sizeof(b);

}

sizeof(b)的值是

答案:4,4,400,4,4,4,4

解析:沒什麼好說的吧

5.下面代碼的結果是多少?爲何?

int main(void)

{

    char a[1000];

    int i;

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

        a[i] = -1-i;

    printf("%d", strlen(a));

    return 0;

}

答案:255

解析:基本上算是個」輪迴」的問題,strlen遇到a[i]=0的時候就終止了,如今的問題變成循環多少次a[i]=0了,那麼就使用補碼來計算到底多少次以後char會溢出爲0,個人回答是一個輪迴,也就是256次,那麼strlen不包含0的位置,那麼長度就是255了.

相關文章
相關標籤/搜索