Почему передача параметров функции в инициализацию структуры возвращает мусор или, по-видимому, ничего не делает?

#c #struct #initialization

#c #структура #инициализация

Вопрос:

Я пытаюсь создать функцию на c для создания и возврата новой структуры, подобной конструктору в ООП. При проверке переменных строка является мусорной, в то время как все числа равны 0. Можно ли не инициализировать структуры с использованием переменных в c?

Я искал в Интернете людей, которые пытаются сделать нечто подобное, но все они используют литералы и строки для инициализации своих.

 typedef struct tArtist{
    char realName[20];
    int accNum;
    double accBal;
    char telephoneNumber[15];
    double earningPerYear;
} Artist;




...

//function call
Artist artist = newArtist("Real Name", 123, 600.43, "1-(876)-362-2335", 999.99);

     Artist newArtist(char name[], int accountNum, double accountBal, char tele[], double earningPerYr) {
         Artist tempArtist = {name, accountNum, accountBal, tele, earningPerYr };


         return tempArtist;
     }
  

Я ожидал, что в качестве теста realName будет «реальным именем», но получил X{XRc

Комментарии:

1. Нам нужен полностью компилируемый пример, чтобы точно сказать, что происходит не так. Массивы символов имеют ограниченный срок службы, поэтому это может быть тем, что сбивает вас с толку.

2. name и tele распадаются на char * , но вы пытаетесь сохранить их в массивах char

Ответ №1:

Когда вы используете name в качестве первого значения в инициализаторе Artist , вы пытаетесь сохранить указатель в массиве символов. Это неверный инициализатор.

Вам нужно явно задать эти поля:

  Artist newArtist(char name[], int accountNum, double accountBal, 
                  char tele[], double earningPerYr) {
     Artist tempArtist = {"", accountNum, accountBal, "", earningPerYr };
     strcpy(tempArtist.realName, name);
     strcpy(tempArtist.telephoneNumber, tele);

     return tempArtist;
 }
  

Комментарии:

1. Это устранило проблему, но почему это повлияло на числа? Также я понимаю, что вы говорите о сохранении указателя, но почему он не распознает его как указатель на строку, как в случае с обычными строковыми инициализациями?

2. @Deeswoc Компилятор попытался сохранить значение указателя в realName[0] , затем следующий инициализатор в realName[1] и так далее. Таким образом, это имело каскадные эффекты.

Ответ №2:

Альтернативным способом достижения этого было бы сделать ваши ‘realName’ и ‘telephoneNumber’ указателями на массивы символов, а затем присвоить массивам в вашем конструкторе нужные вам размеры.

После этого используйте вызов strcpy() для перемещения ваших строк.