2017-08-13 46 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'这些函数(需要动态分配)不包含在标准库中?只是为了与嵌入式系统兼容? –