Почему я получаю ошибку 3221226356 при вызове free на C?

#c #gcc #malloc #free

#c #gcc #malloc #Бесплатно

Вопрос:

Я изучаю C и решаю некоторые проблемы с кодированием.
При выполнении 1 задачи мне нужно создать динамический 2D-массив символов.

Я пытаюсь следовать некоторым другим ответам StackOverflow, чтобы динамически создавать 2D-массив.

Я могу создать его, но при попытке освободить память я получаю сообщение об ошибке 3221226356.
Ниже приведен мой код:

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

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

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

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

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

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

        printf("Freeing sn");

        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]
 

Я пытался вызвать free на amp;s[i], а также *s[i], но оба приводят к ошибке.
Мой компилятор — GCC.

Что я делаю не так?

Комментарии:

1. Ваши malloc free вызовы and выглядят нормально, но вы искажаете указатели на строки, scanf вводя amp;s[i] вместо s[i] . ( %s Формат и его двоюродный %[ брат принимают для заполнения строки, которые уже переданы как указатели. Также: пожалуйста, активируйте предупреждения с -Wall помощью . Они покажут вам несоответствия формата.)

2. Все ваши amp;s[i] должны быть просто s[i] . amp;s[i] имеет тип char ** , поэтому не может использоваться с scanf , printf , s[i] и т.д. имеет тип char * , который вам нужен. Ваш компилятор должен был предупредить об этих ошибках. На практике указатели будут иметь одинаковое значение, так что это будет «работать», но это неправильно.

3. М. Оем прав, хотя, если вы хотите сохранить свою строку с определенным индексом , вы могли бы использовать scanf('%s",amp;s[i][index] , scanf("%s",s[i]) равнозначно scanf("%s",amp;s[i][0] .

4. Примечание: 3221226356 равно 0xC000 0374.

5. Лучший первый шаг — включить; все предупреждения компилятора. Хороший компилятор предупредит scanf("%s", amp;s[i]); ... printf("%s - %dn", amp;s[i], strlen(amp;s[i])); и ускорит ваше программирование.

Ответ №1:

Итак, отзывы о amp; s [i] привели меня к своего рода очевидному решению.
Чтобы создать временную переменную для scanf.

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

int main(int argc, char *argv[])
{
    int n;
    scanf("%d", amp;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], '', 1000);
        scanf("%s", tmp);
        s[i] = tmp;
    }

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

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

    printf("Freeing sn");

    free(s);

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