Задан массив структур, содержащий фамилии и название группы. Массив привести в порядок по фамилиям

Дебагер выдаёт ошибку в 54 строке "Вызвано исключение по адресу 0x00007FF96A5BDEFE (ucrtbased.dll) в Project1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00007FF643F1AD8C."

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define N 5


struct st_info
{
    char* surname;
    char group[5];
};

void SortAndPrint(struct st_info* st);


void main()
{
    struct st_info st[N];
    int j;

    char* Surnames[5] = { "Tesla", "Twen", "Zelenskyi", "Tesla", "Jonson" };

    srand(time(NULL));
    for (j = 0; j < N; j++)
    {
        printf("Enter group:\n");
        gets(st[j].group);
        st[j].surname = Surnames[rand() % 5];
    }
    printf("\n");
    for (j = 0; j < N; j++)
    {
        printf("Surname: %s\n", st[j].surname);
        printf("Group: %s\n", st[j].group);
    }
    printf("\n-------------------------------------------------------\n");

    SortAndPrint(&st);
}

void SortAndPrint(struct st_info* st)
{
    int i, j;
    //сортировка
    for (i = 0; i < N-1; i++)
        for (j = i + 1; j < N; j++)
            if (strcmp(st[i].surname, st[j].surname) > 0)
            {
                char cur[64];
                strcpy_s(cur, sizeof(cur), st[i].surname);
                strcpy_s(st[i].surname, sizeof(st[i].surname), st[j].surname);
                strcpy_s(st[j].surname, sizeof(st[j].surname), cur);
            }
    printf("Results:\n");
    for (i = 0; i < N; i++)
    {
        printf("Surname: %s\n", st[i].surname);
        printf("Group: %s\n", st[i].group);
    }
    printf("\n");
}

Ответы (1 шт):

Автор решения: Harry

Начнем с того, что вызывать надо SortAndPrint(st);.

Но главное — вы просто присваиваете полю указатель на строковый литерал SortAndPrint(st);, а потом пытаетесь его копировать —

strcpy_s(st[i].surname, sizeof(st[i].surname), st[j].surname);

Во-первых, куда? В строковый литерал, который менять нельзя?

Во-вторых, sizeof(st[i].surname) — это размер указателя (впрочем, в данном случае это уже неважно, поскольку в любом случае выделенной памяти для записи строк у вас нет).

Вам надо обменивать не содержимое строк (нет его у вас как такового), а просто указатели!

→ Ссылка