C語言詳細分析講解關(guān)鍵字goto與void的作用
一、關(guān)于goto
- 高手潛規(guī)則:禁用 goto
- 項目經(jīng)驗:程序質(zhì)量與 goto 的出現(xiàn)次數(shù)成反比
- 最后的判決:將 goto 打入冷宮
下面看一段 goto 副作用分析的代碼:
#include <stdio.h>
#include <malloc.h>
void func(int n)
{
int* p = NULL;
if( n < 0 )
{
goto STATUS;
}
p = (int*)malloc(sizeof(int) * n);
STATUS:
p[0] = n;
free(p);
}
int main()
{
printf("begin...\n");
printf("func(1)\n");
func(1);
printf("func(-1)\n");
func(-1);
printf("end...\n");
return 0;
}下面為輸出結(jié)果:

這段代碼中當 func 的入口參數(shù) n 的值小于 0 時,就會 goto 到STATUS 那里去執(zhí)行代碼,但是由于跳過了分配內(nèi)存環(huán)節(jié),就不能把 n 的值賦給 p[0],強行賦值就會發(fā)成段錯誤。
二、void 的意義
void 修飾函數(shù)返回值和參數(shù)
- 如果函數(shù)沒有返回值,那么應(yīng)該將其聲明為 void
- 如果函數(shù)沒有參數(shù),應(yīng)該聲明其參數(shù)為 void
void 修飾函數(shù)返回值和參數(shù)是為了表示“無”
下面這段代碼就表示 f 函數(shù)的輸入?yún)?shù)沒有限制。

不存在 void 變量
- C語言沒有定義 void 究竟是多大內(nèi)存的別名
- 沒有 void 的標尺
- 無法在內(nèi)存中裁剪出 void 對應(yīng)的變量
在下面的代碼中,只有 void* 那條語句可以編譯通過,因為 void* 指針是合法的。

小貼士
- ANSI C:標準 C 語言的規(guī)范
- 擴展C:在 ANSI C 的基礎(chǔ)上進行了擴充

上面的代碼在 ASNI C編譯器中無法通過編譯,但是對于支持 GNU 標準的 gcc 編譯器而言是合法的。
void 指針的意義
- C 語言規(guī)定只有相同類型的指針才可以相互賦值
- void* 指針作為左值用于“接收”任意類型的指針
- void* 指針作為右值使用時需要進行強制類型轉(zhuǎn)換

下面看一段通過 void* 實現(xiàn) MemSet 函數(shù)的代碼:
#include <stdio.h>
void MemSet(void* src, int length, unsigned char n)
{
unsigned char* p = (unsigned char*)src;
int i = 0;
for(i=0; i<length; i++)
{
p[i] = n;
}
}
int main()
{
int a[5];
int i = 0;
MemSet(a, sizeof(a), 0);
for(i=0; i<5; i++)
{
printf("%d\n", a[i]);
}
return 0;
}下面為輸出結(jié)果:

void* 定義的 src 表示可以接收任意類型的指針,所以數(shù)組 a 可以是任意類型。
三、小結(jié)
- 現(xiàn)代軟件工程中禁用 goto 語句
- void 是一種抽象的數(shù)據(jù)類型
- void 類型不能用于定義變量
- void 類型用于聲明函數(shù)無參數(shù)
- void 類型用于聲明函數(shù)無返回值
- 可以定義 void* 類型的指針
- void* 類型的指針可以接受任意類型的指針值
到此這篇關(guān)于C語言詳細分析講解關(guān)鍵字goto與void的作用的文章就介紹到這了,更多相關(guān)C語言goto與void內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語言函數(shù)棧幀的創(chuàng)建和銷毀過程詳解
我們知道c語言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧2021-08-08
C++淺析序列數(shù)據(jù)封裝與優(yōu)化實現(xiàn)方法
封裝是面向?qū)ο缶幊讨械陌褦?shù)據(jù)和操作數(shù)據(jù)的函數(shù)綁定在一起的一個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全,數(shù)據(jù)封裝是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機制,數(shù)據(jù)抽象是一種僅向用戶暴露接口而把具體的實現(xiàn)細節(jié)隱藏起來的機制2022-12-12
C++解決大數(shù)組棧內(nèi)存不夠問題的方法分析
這篇文章主要介紹了C++解決大數(shù)組棧內(nèi)存不夠問題的方法,結(jié)合實例形式對比分析了C++針對大數(shù)組棧內(nèi)存不足情況的常見解決方法及其優(yōu)缺點,具有一定參考借鑒價值,需要的朋友可以參考下2018-05-05
C語言 strftime 格式化顯示日期時間的實現(xiàn)
下面小編就為大家?guī)硪黄狢語言 strftime 格式化顯示日期時間的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12

