Необъявленная переменная c в функции указателя структуры

Я все еще изучаю 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;
}

person blabla444    schedule 13.08.2017    source источник


Ответы (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 на всех платформах.

person Sergey Kalinichenko    schedule 13.08.2017
comment
Я также предложу использовать strdup (если есть) вместо malloc(strlen(...)+1)... - person David Ranieri; 13.08.2017
comment
@KeineLust Мне нравится strdup, это избавляет меня от необходимости печатать. Однако я не хочу рекомендовать его из соображений портативности. Я бы хотел, чтобы это было частью стандарта, особенно учитывая его простоту. - person Sergey Kalinichenko; 13.08.2017
comment
правда, не на 100% переносимая, но почему такие функции (требующие динамического выделения), как strdup, itoa, trim... не включены в стандартную библиотеку? только для совместимости со встроенными системами? - person David Ranieri; 13.08.2017
comment
@KeineLust Вот полный вопрос и ответ, посвященный этой теме, с интересными ответами с обеих сторон. - person Sergey Kalinichenko; 13.08.2017