a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

12個關于C語言的有趣問答

2020-01-26 15:27:27
字體:
來源:轉載
供稿:網友

本文匯總了12個關于C語言的問答,對于加深對C語言程序設計的難點理解很有幫助,讀者可參考一下:

1、gets() 方法

問:以下代碼有個被隱藏住的問題,你能找到它嗎?

答:這個不顯眼的問題就是使用了 gets() 方法。此方法接受一個string類型參數,但是卻沒有檢測此數值是否 有足夠的空間來拷貝數據。所以這里我們一般用 fgets() 方法將來的更好。

#include<stdio.h> int main(void){  char buff[10];  memset(buff,0,sizeof(buff));   gets(buff);   printf("/n The buffer entered is [%s]/n",buff);   return 0;}

2、strcpy() 方法

問:密碼防護是很基本的功能,看看能否搞定下面這段代碼?

#include<stdio.h> int main(int argc, char *argv[]){  int flag = 0;  char passwd[10];   memset(passwd,0,sizeof(passwd));   strcpy(passwd, argv[1]);   if(0 == strcmp("LinuxGeek", passwd))  {    flag = 1;  }   if(flag)  {    printf("/n Password cracked /n");  }  else  {    printf("/n Incorrect passwd /n");   }  return 0;}

3、main() 方法的返回類型

問:請問下面這段代碼能否通過編譯?如果能的話,那么這段代碼中隱含什么問題嗎?

#include<stdio.h> void main(void){  char *ptr = (char*)malloc(10);   if(NULL == ptr)  {    printf("/n Malloc failed /n");    return;  }  else  {    // Do some processing     free(ptr);  }   return;}

答:答案是代碼能通過編譯,但是會留下針對main()方法的返回類型的警告。main()方法的真正返回類型應該為'int'而非'void'。這是因為'int'返回類型能夠讓程序返回狀態值。尤其是當這段程序作為其他應用的附屬程序時這個狀態值將更加重要。

4、內存泄露

問:請問以下代碼有內存泄露嗎?

#include<stdio.h> void main(void){  char *ptr = (char*)malloc(10);   if(NULL == ptr)  {    printf("/n Malloc failed /n");    return;  }  else  {    // Do some processing  }   return;}

答:好,雖然上面的代碼沒有對指針 ptr 進行內存釋放,但實際上即使是程序結束也不會造成內存泄露,因為當程序結束時所有一開始被占據的內存就全部清空了。但如果上面這段代碼是在 while 循環里面那將會造成嚴重的問題

補充: 如果你需要了解更多關于內存泄露的問題,你可以參考這篇文章//www.5lwq4hdr.cn/article/41216.htm

5、free() 方法

問:以下代碼當用戶輸入'freeze'時會奔潰,而如果輸入'zebra'則運行正常,這是為什么?

#include<stdio.h> int main(int argc, char *argv[]){  char *ptr = (char*)malloc(10);   if(NULL == ptr)  {    printf("/n Malloc failed /n");    return -1;  }  else if(argc == 1)  {    printf("/n Usage /n");  }  else  {    memset(ptr, 0, 10);     strncpy(ptr, argv[1], 9);     while(*ptr != 'z')    {      if(*ptr == '')        break;      else        ptr++;    }     if(*ptr == 'z')    {      printf("/n String contains 'z'/n");      // Do some more processing    }     free(ptr);  }   return 0;}

答:問題的根源是因為代碼在while循環中改變了 ptr 指針的地址。當輸入為'zebra'時,while循環甚至在執行 第一遍前就結束了,所以free()釋放的內存地址就是一開始malloc()分配的地址。但是當輸入'freeze'時, ptr記錄的地址在while循環中被更改,因為將會是錯誤的地址傳遞到free()方法中引起崩潰。

6、atexit with _exit

問:在以下代碼,atexit()方法并沒有被調用,你知道為什么嗎?

#include<stdio.h> void func(void){  printf("/n Cleanup function called /n");  return;} int main(void){  int i = 0;   atexit(func);   for(;i<0xffffff;i++);   _exit(0);}

答:這是因為使用了 _exit() 方法。此方法并沒有調用清除數據相關的方法,比如 atexit()等。

7、void* 與 C 結構體

問:能否設計一個方法接受任意類型的參數然后返回整數?同時是否有辦法傳遞多個這樣的參數?

A:一個能接受任意類型參數的方法像下面這個樣子:

int func(void *ptr)

如果需要傳遞多個參數,那么我們可以傳遞一個包含這些參數的結構體

8、* 與 ++ 操作符

問:以下代碼將輸出什么?為什么?

#include<stdio.h> int main(void){  char *ptr = "Linux";  printf("/n [%c] /n",*ptr++);  printf("/n [%c] /n",*ptr);   return 0;}

答:以上的輸出將是:

因為++與 * 的優先級一樣,所以 *ptr++ 將會從右向左操作。按照這個邏輯,ptr++ 會先執行然后執行*ptr。所以第一個結果是'L'。也因為 ++ 被執行了,所以下一個printf() 結果是'i'。

9、Making changes in Code segment

問:以下代碼運行時一定會崩潰,你能說出原因嗎?

#include<stdio.h> int main(void){  char *ptr = "Linux";  *ptr = 'T';   printf("/n [%s] /n", ptr);   return 0;}

答:這是因為,通過 *ptr = ‘T',此行代碼嘗試更改只讀內存存儲的字符串'Linux'。此操作當然行不通所以才會造成崩潰。

10、Process that changes its own name

問:你能否寫一個程序在它運行時修改它的名稱?

答:以下代碼可以完成

#include<stdio.h> int main(int argc, char *argv[]){  int i = 0;  char buff[100];   memset(buff,0,sizeof(buff));   strncpy(buff, argv[0], sizeof(buff));  memset(argv[0],0,strlen(buff));   strncpy(argv[0], "NewName", 7);   // Simulate a wait. Check the process  // name at this point.  for(;i<0xffffffff;i++);   return 0;}

11、局部變量的返回地址

問:下面的代碼有問題嗎?如果有,如何修改?

#include<stdio.h> int* inc(int val){ int a = val; a++; return &a;} int main(void){  int a = 10;   int *val = inc(a);   printf("/n Incremented value is equal to [%d] /n", *val);   return 0;}

答:雖然上面的代碼有時運行會很好,但是在方法 inc() 中有很嚴重的隱患。當inc()方法執行后,再次使用局部變量的地址就會造成不可估量的結果。解決之道就是傳遞變量a的地址給main()。

12、處理 printf() 參數

問:以下代碼輸出請問是什么?

#include<stdio.h> int main(void){  int a = 10, b = 20, c = 30;   printf("/n %d..%d..%d /n", a+b+c, (b = b*2), (c = c*2));   return 0;}

答:輸出將是

110..40..60

這是因為參數都是從右向左處理的,然后打印出來卻是從左向右。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 99国产精品99久久久久久 | 亚洲一区不卡 | 日韩中文字幕一区二区 | 一区二区精品在线 | 日本三级在线观看网站 | 97久久精品午夜一区二区 | 狠狠躁夜夜躁人人爽视频 | 青青草国产成人av片免费 | 日本激情网 | 成人国产精品一级毛片视频 | 欧美午夜精品一区二区三区电影 | 99国产视频 | 91麻豆精品久久久久蜜臀 | 97视频观看 | 日韩精品专区 | 黄色大片在线免费观看 | 久久久久久免费毛片精品 | 国产综合精品一区二区三区 | 日韩一区二区三区在线 | 五月天婷婷激情视频 | 日韩一区二区精品 | 亚洲精品一区二区网址 | 亚洲成年 | 国产成人精品一区二区三区 | 精品在线一区二区三区 | 不卡视频一区 | 亚洲国产精品一区二区久久 | 成人免费视频www在线观看我 | 中文字幕亚洲不卡 | 国产精品视频 | 99精品电影| 精品国产一区二区三区在线观看 | 精品国产99| 狠狠久久综合 | 色婷婷综合在线 | 91在线视频免费观看 | 亚洲精品在 | 亚洲成人国产精品 | 四虎在线观看 | 日韩成人精品视频 | 日本国产在线 |