我需要在 c 中使用动态内存按字母顺序排列名称

I need to arrange names in alphabetical order using dynamic memory in c

目标是获取 'n' 个名称作为输入,并使用动态内存分配按字母顺序排列它们。如果我输入 4 个名称,代码工作正常。但是如果我输入超过 5 个,代码会在我输入第五个名字后中断。它不接受第 6 个名字,即使我给 n 作为 6。 谁能告诉我为什么?以及解决方法? 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(char[], char[]);

int main()
{
    char** name;
    int i, n, j, y;
    printf("Enter the number of names:");
    scanf("%d", &n);
    name = (char**)malloc(n * sizeof(char));
    for (i = 0; i < n; i++)
    {
        name[i] = (char*)malloc(100 * sizeof(char));
    }
    printf("Enter the names:\n");
    for (i = 0; i < n; i++)
    {
        scanf("%s", *(name + i));
    }
    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            y = strcmp(name[i], name[j]);
            if (y >= 0)
            {
                swap(name[i], name[j]);
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%s\n", name[i]);
    }
    return 0;
}

void swap(char a[], char b[])
{
    char temp[20];
    strcpy(temp, a);
    strcpy(a, b);
    strcpy(b, temp);
}

在此语句中,分配的内存大小指定不正确

name = (char**)malloc(n * sizeof(char));
                          ^^^^^^^^^^^^

你必须写

name = (char**)malloc(n * sizeof(char *));   
                          ^^^^^^^^^^^^^

交换功能一般不正确。对于初学者来说,不清楚为什么使用幻数 20

char temp[20];

而分配的字符数组的大小等于 100。

name[i] = (char*)malloc(100 * sizeof(char));

你需要的只是交换指向字符串的指针。例如,可以通过以下方式声明和定义函数 swap

void swap( char **a, char **b )
{
    char *temp = *a;
    *a = *b;
    *b = temp;
}

并称赞

swap( name + i, name + j );

另外为了让输入更安全你应该写

scanf( "%99s", *( name + i ) );

注意当数组不再需要时,你应该释放所有分配的内存。