Динамически размещаемый многомерный массив - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь определить массив строк, используя malloc, но некоторые значения возвращают ошибку нарушения доступа. Поскольку вся программа обширна, я добавляю только часть, где объявлена ​​матрица:

int main(void)
{
    char* temp;
    char p[MAXSIZE];
    printf("This program lists the possible permutations of a character sequence\n");
    printf("Enter your sequence: ");
    scanf_s("%s", &p, MAXSIZE);
    temp = malloc(sizeof(char) * (strlen(p)));
    int count[MAXSIZE / 2] = { 0 };
    char* y = checkforrepetition(p, count);
    char** u = malloc(sizeof(char) * possibilities(count,strlen(p))*MAXSIZE);
    for (int i = 0; i <= (possibilities(count,strlen(p)) - 1); i++)
    {
        u[i] = malloc(sizeof(char)*MAXSIZE);
    }
    recursivepermute(p, 0, temp, strlen(p), u, possibilities(count,strlen(p)));
}

Я использую scanf_s, потому что Visual Studio требует от меня этого. Я хотел бы знать, является ли ошибка проблемой с объявлением самого массива или есть ли ошибка где-то еще в коде.

Краткое объяснение таково: функция возможностей возвращает количество комбинаций, возможных для строка, предоставленная пользователем. Назначение массива u состоит в том, чтобы хранить уже сделанные перестановки, чтобы избежать повторения одной и той же комбинации в строках с повторяющимися символами.

1 Ответ

0 голосов
/ 07 января 2020
  1. Строка 8: temp не инициализирована. Попробуйте

    temp = malloc(sizeof(char) * (strlen(p)+1));
    strcpy(temp,p);
    

    Примечание: strlen() возвращает количество символов от начала буфера до (исключая) первого нулевого терминатора '\0', но strcpy копирует все, включая первый нулевой терминатор. Следовательно strlen(p) + 1 выше.

  2. Строка 10: Вы, кажется, не используете char* y? Убедитесь, что checkforrepetition(p, count) возвращает память кучи и очистку y в основной области.
  3. Строка 11: mallo c из двойного массива char** u неверен. Шаблон:

    //malloc the container
    char** stringArray = (char**)rcMalloc(numberOfArrayElements * sizeof(char*));
    //malloc the elements
    for (int i = 0; i < numberOfArrayElements; i++)
    { 
      stringArray[i] = (char*)rcMalloc((sizeOfElement + 1) * sizeof(char));
      strcpy(stringArray[i], "");
    }
    

    или эквивалентный сокращенный (арифметика указателя c). Уничтожение следует за перевернутыми шагами (сначала элементы, затем контейнер). Ваш код может быть:

    char** u = malloc(sizeof(char*) * possibilities(count,strlen(p)));
    for (int i = 0; i < possibilities(count,strlen(p)); i++)
    {
        u[i] = malloc(sizeof(char) * (MAXSIZE + 1));
    }
    
...