2011-04-27 68 views
1

我有一段時間沒有在C中編程,並且遇到將字符串傳遞給函數的問題。代碼有效,但是我收到來自gcc的警告。衝突類型警告傳遞字符串在C中運行時

我調用該函數在我的主要有:

copyToCode(code, section1, section2); 

功能是:

void copyToCode (char **code, char *loc, char *data){} 

我得到「衝突的類型copyToCode」上包含的功能和「上一個隱式聲明的行copyToCode在這裏「在調用該函數的行上發出警告。

我已經聲明的變量:

char *code = malloc (32*1000* sizeof(char)); 

char *section1 = malloc(8*sizeof(char)), *section2 = malloc(8*sizeof(char));

我也試過這樣: char *section1[8];

作爲一個方面的問題 - 這是正確的?

section1和section2應該是字符串,代碼應該是一個字符串數組。

感謝您的閱讀,感謝您的幫助。 Gareth

+0

請發佈完整的代碼。 – 2011-04-27 13:05:39

+0

您可以請傳遞您的參數的類型聲明copyToCode。很難說什麼時候我們什麼時候看不到你真的在傳遞什麼。 – Chris 2011-04-27 13:06:01

+0

什麼是「先前的隱式聲明」消息引用的行上的聲明? – 2011-04-27 13:06:22

回答

3

您需要在調用函數之前聲明該函數,否則編譯器會嘗試以您的名義計算函數原型。

消息

以前聲明copyToCode

的告訴你這一點。隱式聲明是編譯器所做的,因爲你還沒有給它一個明確的聲明。


在你更新的問題,你說code旨在成爲一個字符串數組,但你把它定義爲:

char *code = malloc (32*1000* sizeof(char)); 

,其分配一個字符串。一串字符串將保存在char**中,就像argv一樣。您需要首先分配數組,其中包含n字符串,每個字符串都是char*。然後你必須在循環中逐一分配每個char*

這種編碼在C++中使用標準庫字符串和矢量類非常容易。

+0

我通過在主函數上面加上 'void copyToCode(char ** code,char * loc,char * data);' 來修復代碼。 謝謝!是一個愚蠢的錯誤! – gskspurs 2011-04-27 13:14:43

+0

@gskspurs這不會真正解決問題,但它是朝正確方向邁出的一步。 – 2011-04-27 13:16:08

0

您能否介紹一下您用作函數參數的變量的更多細節?

另外值得注意的是,copyToCode的第一個參數是pointer to a pointer of chars,可以用作array of strings

行:

void copyToCode (char **code, char *loc, char *data){} 

是你的函數的聲明?在這種情況下,您應該這樣寫:

void copyToCode (char **code, char *loc, char *data); 
+0

我已經更新了這個問題,這是正確的方式來聲明一個字符串數組? – gskspurs 2011-04-27 13:17:38

+0

這[討論](http://stackoverflow.com/questions/1088622/how-do-i-create-an-array-of-strings-in-c)可能對你的問題有用。 – 2011-04-27 13:27:45

+0

非常感謝您的幫助。 – gskspurs 2011-04-27 13:29:21

0

此警告意味着您的聲明與實現不同。或者你有兩個不同的函數聲明。

因爲警告提到了隱式聲明這意味着該聲明是由gcc推導出來的,因爲在聲明它之前使用了該函數。 GCC將使用函數調用的參數來推斷聲明,這可能會導致令人討厭的問題。

如果您聲明該函數,您可能仍然會收到錯誤,但它應該更具體。

附註:如果你正在用gcc工作,總是編譯爲gcc -std=c99 -pedantic -Wall -Wextra -Wwrite-strings source.c

您的編輯:您的變量是錯誤的。代碼是char *,但您的功能需要char **

+0

那麼我究竟如何生成一個字符數組,作爲我想要的代碼呢? – gskspurs 2011-04-27 13:18:20

+0

@gskspurs你想要什麼?你沒有具體說明。你沒有指定爲什麼該函數將指針指向指針。用您提供的信息量來回答是不可能的。 – 2011-04-27 13:21:59

+0

對不起,我會盡力解釋一下: 我希望變量'code'是一個長度爲32的字符的大數組。我該如何聲明?目前我有: 'char * code = malloc(32 * 1000 * sizeof(char));' 是類似char'* code [32]'正確的? – gskspurs 2011-04-27 13:26:08

0

定義字符串數組,你需要像下面這樣:

char **code; 
int i; 
code = malloc (32*sizeof(*code)); 
for (i=0; i<32; i++) { 
    code[i]=malloc(1000*sizeof(**code)); 
} 

注意,這不包括錯誤檢查的結果的malloc,你應該做的。它會創建一個包含大小爲1000的字符串的32位數組,這不應該是硬編碼。

+1

太好了,謝謝,我其實想要實現一個大小爲32的1000個字符串的數組。所以我簡單地將它們的值更改爲: 'code char ** code; int i; code = malloc(1000 * sizeof(* code)); (i = 0; i <1000; i ++){[code] [i] = malloc(32 * sizeof(** code)); }' – gskspurs 2011-04-27 13:27:55

+0

就是這樣!但是C++字符串和向量等的確很容易 – 2011-04-27 14:53:24

+0

也許,但問題是'C',而不是'C++'。 – BMitch 2011-04-27 18:58:49