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了.