2016-08-22 74 views
-2

首先,看看下面簡單的代碼:當我們初始化數據類型char *和什麼時候沒有?

char str[80] = "This is - my text - for test"; 
const char s[2] = "-"; 
char *token; 
token = strtok(str, s); 

while (token != NULL) { 
    printf(" %s\n", token); 
    token = strtok(NULL, s); 
} 

strtok()返回的數據類型char*的功能,正如你看到的,我們創建了一個名爲token變量未初始化變量。

現在,看下面的代碼:

char *buff; 
int num = 500; 
sprintf(buff, "%d", num); 

以前的代碼的結果是一個錯誤uninitialized local variable 'buff'
我的問題是,爲什麼在第一個代碼中沒有發生任何問題,而在第二個代碼中發生錯誤?

+0

'char * token = strtok(str,s);' –

+0

@PeteBecker:這是直接分配的。 –

+0

這是**初始化**。原始代碼創建未初始化的'token',然後**爲其分配**。對於像'int'和指針這樣的簡單類型,差異在技術上有時並不重要(假設你在創建未初始化變量後立即進行賦值),但出錯的機率要高得多。但對於構造者做重要工作的類型而言,存在很大差異。 –

回答

6

因爲在第一個片段,你初始化變量token,通過調用strtok和分配調用變量的結果。

在第二個示例中,您保留未初始化的變量buff

您可以用定義的實際初始化來初始化局部變量。 通過分配給其他地方的變量。重要的是,您可以在之前執行此初始化或分配,然後以任何其他方式使用該變量。

+0

這個'sprintf(buff ....'被認爲是作業或被認爲是用法 –

+0

@LionKing'sprintf'函數將第一個參數寫入指向***的內存***,它不會修改如果你不確定,*總是*以某種方式初始化變量 –

+0

@LionKing'sprintf(buff ...'使'buff'(作爲參數)的一個*副本*作爲參數,但是'buff'具有沒有被賦予一個價值。 – Galik

相關問題