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

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

提问人:Quintonn 提问时间:12/14/2020 更新时间:12/16/2020 访问量:155

问:

我正在学习 C 语言并做一些编码挑战来学习。
在进行 1 个挑战时,我需要创建一个动态的 2D 字符数组。

我正在尝试遵循其他一些 StackOverflow 答案来动态创建 2D 数组。

我能够创建它,但是在尝试释放内存时,我收到错误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], '\0', 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],但两者都会导致错误。
我的编译器是GCC。

我做错了什么?

C GCC Malloc 免费

评论

4赞 M Oehm 12/14/2020
您的 和 调用看起来没问题,但是您通过 'ing into 而不是 .(该格式及其表亲需要填充字符串,这些字符串已作为指针传递。另外:请使用 激活警告。它们将显示格式不匹配。mallocfreescanf&s[i]s[i]%s%[-Wall
0赞 Tom Karzes 12/14/2020
你们所有人都应该只是. 有类型,所以不能与 、 等一起使用。 有你想要的类型。你的编译器应该警告这些错误。在实践中,指针将具有相同的值,因此它会“工作”,但这是不正确的。&s[i]s[i]&s[i]char **scanfprintfs[i]char *
0赞 alex01011 12/14/2020
M. Oehm 是对的,尽管如果您希望将字符串保存在特定索引处,则可以使用 ,等价于 。scanf('%s",&s[i][index]scanf("%s",s[i])scanf("%s",&s[i][0]
0赞 chux - Reinstate Monica 12/14/2020
注意:3221226356 0xC000 0374。
0赞 chux - Reinstate Monica 12/14/2020
最好的第一步是启用;所有编译器警告。一个好的编译器会警告并加快你的编程速度。scanf("%s", &s[i]); ... printf("%s - %d\n", &s[i], strlen(&s[i]));

答:

0赞 Quintonn 12/16/2020 #1

因此,对 &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], '\0', 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;
}