2017-08-13 75 views
2

我仍在學習C語言,並且正在做一個練習,我必須編寫一個汽車數據庫。在主函數中,我聲明瞭一個包含100個指向'carinfo_t'結構的指針的數組。在函數'* createcarinfo'中應該創建一個新的carinfo_t實例。但是我得到了'brandOfCar'變量未聲明的問題。我不明白爲什麼我會收到這條消息,因爲編譯器應該知道這個變量是結構的一部分,對嗎?該結構在程序中聲明爲數據類型,並且在該函數的開頭初始化指向該結構的指針。結構指針函數中的未聲明變量c

如果此問題已被問到某處,我很抱歉。很感謝任何形式的幫助。

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 
#include <limits.h> 

struct carinfo_t 
{ 
    char *brandOfCar; 
    char *modelOfCar; 
    int yearCarWasBuilt; 
    float valueOfCar; 
}; 


struct carinfo_t *createCarinfo(char *brand, char *model, int year, float 
value) 
{ 
    struct carinfo_t *newCarInfo=(struct carinfo_t*) malloc(sizeof(struct 
carinfo_t)); 
    newCarInfo->brandOfCar=(char*)malloc(sizeof(char)* 
(strlen(brandOfCar)+1));  

//Message: error: 'brandOfCar' undeclared (first use in this function) 

//function not finished 
} 


int main() 
{ 
    struct carinfo_t *carbase[100]={}; 

    return 0; 
} 

回答

3

這是因爲你叫傳入您的構造函數brand,不brandOfCar變量。同樣,您稱爲模型變量model,而不是modelOfCar。這就是爲什麼strlen不能編譯。

這是一個好主意來命名相同的結構一致性的領域變量,並添加const它是適當的:

struct carinfo_t *createCarinfo(
    const char *brandOfCar 
, const char *modelOfCar 
, int yearCarWasBuilt 
, float valueOfCar) { 
    struct carinfo_t *newCarInfo=malloc(sizeof(struct carinfo_t)); 
    newCarInfo->brandOfCar=malloc(strlen(brandOfCar)+1); 
    ... 
} 

還要注意,在C你不投malloc,也不要乘以sizeof(char),該標準在所有平臺上都要求爲1。

+0

我也會建議使用'strdup'(如果有的話)而不是'malloc(strlen(...)+ 1)'... –

+0

@KeineLust我喜歡'strdup',它爲我節省了很多打字。不過,我不願意爲便攜性原因推薦它。我希望它是標準的一部分,特別是考慮到它的簡單性。 – dasblinkenlight

+0

是真實的,不是100%可移植的,但爲什麼像'strdup','itoa','trim'這些函數(需要動態分配)不包含在標準庫中?只是爲了與嵌入式系統兼容? –