幾道C語言題(含參考答案)

來源:互聯網
上載者:User

1. 有以下程式片段:
int a[] = { 1, 2 };
int *p = a;
問:
當sizeof(int) = 4時,
sizeof(a)=? 8,數組嘛,數組個數乘以每個元素大小
sizeof(p)=? 4,所有指標都是4
分別為什嗎?

2. 以下迴圈是死迴圈嗎?
for (int i = 1; i > 0; i++)
  printf("%d\n", i);
為什嗎?
理論上不會死迴圈,因為到了i到了2147483647的時候,再+1會變成-2147483648,就會結束迴圈,但是估計好幾天之後才能運行到那個時候
3. 有以下程式片段:
int a[] = { 1, 2 };
int i = 5;
printf("%d\n", a[-1]);
輸出結果可能是什嗎?
正常編譯器的話,會輸出i的值,原因是棧區資料,既然是棧那麼定義a變數之後,再定義i,根據棧的特性,會放到a的前面,a[-1]表示的就是i,雖然越界很危險,但是確實windows,linux都會輸出i的值5
4. 有以下程式片段:
int i = 5;
int a[] = { 1, 2 };
printf("%d\n", a[3]);
輸出結果可能是什嗎?
同問題3,還是局部棧的原因,但是不一定會輸出5,有個關於數組記憶體對齊情況在內,VC和linux的GCC應該輸出5,別的編譯器不一定
5. 有以下程式片段:
int array[ARRAY_SIZE];
int *pi;

for (pi = &array[0]; pi < &array[ARRAY_SIZE];)
  *++pi = 0;
(1)修改for (pi = &array[0]; pi < &array[ARRAY_SIZE];)這一行,改為等價程式。
for (pi = &array[0]; pi < &array[ARRAY_SIZE];*++pi = 0;) 這樣?
(2)談談這個程式可能運行結果。
第一個元素沒有成功初始化為0,程式會出現越界問題。。原因是:運行到最後一步,pi=&array[ARRAY_SIZE-1] , 運行*++pi=0會越界
(3)小明說這個程式如果後來pi被設定為空白指標的話,會導致死迴圈,還會破壞N多資料。你同意小明的觀點嗎?如果之後pi真的變成null 指標的話,那一般在Windows/Linux下這個程式會是死迴圈嗎?不是的話會發生什嗎?
windows/linux如果pi成了0,會出現段錯誤,程式直接跳出,不會死迴圈破壞N多資料
6. 有一個函數如下:
char *strcpy(char *dest, const char *src)  
{  
  char *temp = dest;  

  if (dest == src)  
  return dest;  
  if (dest == NULL || src == NULL)
return NULL;  
  while (*dest++ = *src++)
  ;  
  return temp;  
}  
小明說如果把if (dest == NULL || src == NULL) return NULL;改為if (dest != NULL || src != NULL)就可以巧妙地利用順序結構的特點簡化掉一個return NULL;,你同意他的做法嗎?
if (dest != NULL && src != NULL) 至少在windows裡邊,這個應該能行得通
7. 有這樣一個程式:
#include <stdio.h>
void foo (void)
{
  int i;
  printf("%d\n", i);
  i = 999;
}
int main (void)
{
  foo();
  foo();
  return 0;
}
運行結果可能為什嗎?為什嗎?在foo();之間加個printf("hello\n");呢?
第一次不可預知(如果在VC裡的話,應該是0xcccccccc的10進位形式-858993460),第二次輸出999;如果之間加個hello,第二次不一定(VC裡可能是6,linux裡應該還是999),依賴編譯器
8. 某人為了給學生講講什麼是指標寫了如下程式:
#include <stdio.h>
int main(int argc, char *argv[])
{
 int a[5] = { 1, 2, 3, 4, 5 };
 unsigned int p;
}
程式還沒寫完,請把p當作指標用它來遍曆數組a,輸出數組a的所有元素。
寫完後思考一下,不用unsigned int用int行不行?為什嗎?

int main(int argc, char *argv[]){    int a[5] = { 1, 2, 3, 4, 5 };    unsigned int p;    p = (unsigned int)a;    for( int i = 0; i < 5; ++i )    {        printf( "%d,", ((int*)p)[i] );  //*(int*)(p+i*sizeof(unsigned int))    }    return 0;}

這樣?
用int的話,需要多做一次轉換把他轉換成unsigned int 否則某些系統如果記憶體配置到0x80000000之後的話,就會小小的悲劇

來自:http://topic.csdn.net/u/20120710/10/172da13c-3653-4b50-9b2f-b5bc2f71819d.html?seed=1453765484&r=79116377#r_79116377

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.