СИ | Ошибка Вызвано исключение по адресу 0x78EAEE39 (ucrtbased.dll) в lab6.2.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCCCCCCCC

    #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>

char mindl(char *s2) {
    char *s3[1000];
    int i = 0;
    char* p;
    p = strtok(s2, " ");
    while (p != NULL)
    {
        printf("%s\n", p);
        p = strtok(s2, " ");
        while (p != NULL) {
            strcpy(s3[i], p);
            i++;
            p = strtok(NULL, " ");
        }
    }
}

int main(int argc, char* argv[])
{
    char s1[1000];
    char rez[1000];
    int n;
    setlocale(LC_ALL, "");
    printf("Введите количетсво строк: ");
    scanf("%d", &n);
    while (getchar() != '\n');
    for (int i = 0; i < n; i++) {
        printf("Введите строку: ");
        gets(s1);
        mindl(s1);

    }
  }

Не работает код, жалуется на strcpy(s3[i], p); Ошибка Вызвано исключение по адресу 0x78EAEE39 (ucrtbased.dll) в lab6.2.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCCCCCCCC.


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

Автор решения: Pak Uula

strcpy(s3[i], p); копирует содержимое строки p в область памяти, на которую указывает s[i]. Вам нужно обеспечить, чтобы по этому адресу было достаточно памяти, чтобы вместить содержимое p.

Самый простой вариант

            size_t len = strlen(p);
            s[i] = malloc(len+1);
            if (s[i] == NULL) { perror("Out of memory"); exit(-1); }
            strcpy(s3[i], p);

Пожалуйста, учитесь сразу делать хорошо. Даже в учебных заданиях.

Вы не проверили возвращаемое значение scanf. Что будет, если клиент введёт что-нибудь вроде qwerty вместо числа? Вы не проверили число n, вдруг оно отрицательное или, наоборот, сильно большое?

Функция main должна возвращать целое число, но вы ничего не возвращаете.

Вы пользуетесь функцией gets для чтения строки. Это категорически небезопасная функция, прямая дорога к атаке через переполнение буфера. Для безопасного чтения строк уже давно придумана функция getline

Объявив char *s3[1000]; вы ожидаете, что будет не более тысячи слов в строке. А если будет тысяча и одна? Привет, переполнение буфера на стеке.

Это можно назвать мелкими придирками, но из такой небрежности впоследствии могут вырасти ошибки совсем другого масштаба, чем проблемы с доступом к памяти в учебной задаче.

→ Ссылка