为什么在 C 中调用 free 时会出现 3221226356 错误?

Why do I get 3221226356 error when calling free in C?

我正在学习 C 并完成一些编码挑战来学习。
在进行 1 项挑战时,我需要创建一个动态二维字符数组。

我正在尝试按照其他一些 Whosebug 答案动态创建二维数组。

我可以创建它,但在尝试释放内存时,我收到错误 3221226356。
下面是我的代码:

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

    int main(int argc, char *argv[])
    {
        int n;
        scanf("%d", &n);

        char **s = malloc(n * sizeof(char *));

        for (int i = 0; i < n; i++)
        {
            s[i] = malloc(1000 * sizeof(char));
            //memset(s[i], '[=10=]', 1000);
            scanf("%s", &s[i]);
        }

        for (int i = 0; i < n; i++)
        {
            printf("%s - %d\n", &s[i], strlen(&s[i]));
        }

        for (int i = 0; i < n; i++)
        {
            printf("Freeing %d\n", i);
            //char *tmp = &s[i];
            free(s[i]);
        }

        printf("Freeing s\n");

        free(s);

        if (argc > 1)
        {
            char xx[100];
            scanf("%s", xx);
        }
        return EXIT_SUCCESS;
    }

以及输出代码的示例 运行:

2
xx
sss
xx - 2
sss - 3
Freeing 0

[process exited with code 3221226356]

我试过在 &s[i] 和 *s[i] 上调用 free 但都导致错误。
我的编译器是 GCC。

我做错了什么?

所以关于 &s[i] 的评论让我找到了一种显而易见的解决方案。
为 scanf 创建临时变量。

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

int main(int argc, char *argv[])
{
    int n;
    scanf("%d", &n);

    char **s = malloc(n * sizeof(char *));

    for (int i = 0; i < n; i++)
    {
        //s[i] = malloc(1000 * sizeof(char));
        char *tmp = malloc(sizeof(char));
        //memset(s[i], '[=10=]', 1000);
        scanf("%s", tmp);
        s[i] = tmp;
    }

    for (int i = 0; i < n; i++)
    {
        printf("%s - %d\n", s[i], strlen(s[i]));
    }

    for (int i = 0; i < n; i++)
    {
        printf("Freeing %d\n", i);
        //char *tmp = &s[i];
        free(s[i]);
    }

    printf("Freeing s\n");

    free(s);

    if (argc > 1)
    {
        char xx[100];
        scanf("%s", xx);
    }
    return EXIT_SUCCESS;
}