Как минимум 5 выпусков:
- Чтобы продублировать строку, убедитесь, что в выделении достаточно места для символов , включая нулевой символ .
В противном случае strcpy()
записывает вне выделения, что составляет неопределенное поведение (UB).
len = strlen(firstName);
// temp->firstName[len] = (char*)malloc(sizeof(char)*(len ));
temp->firstName = (char*)malloc(sizeof(char)*(len + 1));
// + 1
...
strcpy(temp->firstName, firstName);
То же самое для lastName
.
Также присваивайте указателю, а не char
. @ Barmar
Person
члены являются массивами. Для динамического выделения они должны быть указателями. @ NthDeveloper
typedef struct {
// char firstName[15];
// char lastName[15];
char *firstName;
char *lastName;
} Person;
2-й тест неправильный
// if (temp->firstName == NULL)
if (temp->lastName == NULL)
int
против size_t
.
int len = 0;
предполагает, что длина строки соответствует int
. Хотя это очень часто встречается, тип, возвращаемый из strlen()
, равен size_t
. Этот тип unsigned имеет правильный размер для индексации и определения размера массива - не слишком широкий и не слишком узкий. Не ключевой вопрос в этом коде ученика.
// int len = 0;
size_t len = 0;
Совет: приведение не требуется. Выделите объекту, на который указывает ссылка, а не типу. Проще кодировать правильно, просматривать и поддерживать.
// Person *temp = (Person*)malloc(sizeof(Person));
Person *temp = malloc(sizeof *temp);
// temp->firstName[len] = (char*)malloc(sizeof(char)*(len + 1));
temp->firstName = malloc(sizeof *(temp->firstName) * (len + 1));
Совет: Хотя это и не стандарт C, многие платформы предоставляют strdup()
для выделенных и копируемых строк. Образец strdup()
код .
temp->firstName = strdup(firstName);
Совет: Вероятно, наиболее ценный: хороший компилятор с хорошо включенными предупреждениями должен был предупреждать о temp->firstName[len] = (char*)malloc(sizeof(char)*(len));
, так как это сомнительное несоответствие типов в назначении. Эти предупреждения сохраняют вас и нас все время. Убедитесь, что в вашей следующей компиляции включены все предупреждения.