#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() для перемещения ваших строк.