结构指针函数中未声明的变量 c

Posted

技术标签:

【中文标题】结构指针函数中未声明的变量 c【英文标题】:Undeclared variable c in structure pointer function 【发布时间】:2017-08-13 08:14:40 【问题描述】:

我还在学习 C,我正在做一个练习,我必须编写一个汽车数据库。在主函数中,我声明了一个包含 100 个指向“carinfo_t”结构的指针的数组。在函数 '*createcarinfo' 中,应该创建一个新的 carinfo_t 实例。但是我遇到了未声明“brandOfCar”变量的问题。我真的不明白为什么我会收到这条消息,因为编译器应该知道这个变量是结构的一部分,对吧?该结构在程序中被声明为数据类型,并在此函数的开头初始化指向该结构的指针。

如果这个问题已经在某处被问过,我很抱歉。很感谢任何形式的帮助。

#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;

【问题讨论】:

【参考方案1】:

这是因为您调用了传递给构造函数的变量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。

【讨论】:

我还建议使用strdup(如果可用)而不是malloc(strlen(...)+1) ... @KeineLust 我喜欢strdup,它为我节省了很多打字时间。不过,出于便携性的原因,我不愿意推荐它。我希望它是标准的一部分,尤其是考虑到它的简单性。 是的,不是 100% 可移植的,但是为什么像 strdupitoatrim 这样的函数(需要动态分配)没有包含在标准库中?只是为了与嵌入式系统兼容? @KeineLust 这里是an entire Q&A dedicated to this topic,双方都有有趣的答案。

以上是关于结构指针函数中未声明的变量 c的主要内容,如果未能解决你的问题,请参考以下文章

C++基础3(函数指针结构体)

C++基础3(函数指针结构体)

C语言中如何交换两个指针变量的的值

C/C++语法和用法技巧(指针)

C语言基础:函数指针与回调函数size_t类型

C语言 结构指针变量作函数参数和链表基础