直擊C語言——7個有趣的問答
1.gets() 方法
Q:以下程式碼有個被隱藏住的問題,你能找到它嗎?
A:這個不顯眼的問題就是使用了 gets() 方法。此方法接受一個string型別引數,但是卻沒有檢測此數值是否 有足夠的空間來拷貝資料。所以這裡我們一般用 fgets() 方法將來的更好。
#include<stdio.h>
int main(void)
{
char buff[10];
memset(buff,0,sizeof(buff));
gets(buff);
printf(" The buffer entered is [%s] ",buff);
return 0;
}
2,main() 方法的返回型別
Q:請問下面這段程式碼能否通過編譯?如果能的話,那麼這段程式碼中隱含什麼問題嗎?
#include<stdio.h>
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf(" Malloc failed ");
return;
}
else
{
// Do some processing
free(ptr);
}
return
}
A:答案是程式碼能通過編譯,但是會留下針對main()方法的返回型別的警告。main()方法的真正返回型別應該為’int’而非’void’。這是因為’int’返回型別能夠讓程式返回狀態值。尤其是當這段程式作為其他應用的附屬程式時這個狀態值將更加重要。
3,記憶體洩露
Q:請問以下程式碼有記憶體洩露嗎?
#include<stdio.h>
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf(" Malloc failed ");
return;
}
else
{
// Do some processing
}
return;
}
A:好,雖然上面的程式碼沒有對指標 ptr 進行記憶體釋放,但實際上即使是程式結束也不會造成記憶體洩露,因為當程式結束時所有一開始被佔據的記憶體就全部清空了。但如果上面這段程式碼是在 while 迴圈裡面那將會造成嚴重的問題。
4,void* 與 C 結構體
Q:能否設計一個方法接受任意型別的引數然後返回整數?同時是否有辦法傳遞多個這樣的引數?
A:一個能接受任意型別引數的方法像下面這個樣子:
int func(void *ptr)
如果需要傳遞多個引數,那麼我們可以傳遞一個包含這些引數的結構體
5,* 與 ++ 操作符
Q:以下程式碼將輸出什麼?為什麼?
#include<stdio.h>
int main(void)
{
char *ptr = "Linux";
printf(" [%c] ",*ptr++);
printf(" [%c] ",*ptr);
return 0;
}
A:以上的輸出將是:
因為++與 * 的優先順序一樣,所以 *ptr++ 將會從右向左操作。按照這個邏輯,ptr++ 會先執行然後執行*ptr。所以第一個結果是’L’。也因為 ++ 被執行了,所以下一個printf() 結果是’i’。
6,區域性變數的返回地址
Q:下面的程式碼有問題嗎?如果有,如何修改?
#include<stdio.h>
int* inc(int val)
{
int a = val;
a++;
return &a;
}
int main(void)
{
int a = 10;
int *val = inc(a);
printf(" Incremented value is equal to [%d] ", *val);
return 0;
}
A:雖然上面的程式碼有時執行會很好,但是在方法 inc() 中有很嚴重的隱患。當inc()方法執行後,再次使用區域性變數的地址就會造成不可估量的結果。解決之道就是傳遞變數a的地址給main()。
7,處理 printf() 引數
Q:以下程式碼輸出請問是什麼?
#include<stdio.h>
int main(void)
{
int a = 10, b = 20, c = 30;
printf(" %d..%d..%d ", a+b+c, (b = b*2), (c = c*2));
return 0;
}
A:輸出將是
110..40..60
這是因為引數都是從右向左處理的,打印出來卻是從左向右。
喜歡文章的可以給小編關注以及點贊
想學習c/c++的小夥伴可以加群:941636044,私聊群主領取C語言基礎資料哦~