Тройные указатели Си: невозможно скопировать строку в тройной указатель положения [x] [y], где [x] больше 1 - PullRequest
0 голосов
/ 05 февраля 2019

Я пробую тройные указатели в первый раз. Этот вопрос , где я получил информацию о том, как выделить тройной указатель, и вот как был выделен тройной указатель:

//In this case size will always be 4
int size = countLines(file);
printf("size: %d\n", size);
char*** tripleptr = malloc(sizeof(*tripleptr)*size);
int i = 0, k = 0, j = 0;
for(; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}

Если я пытаюсь скопировать строковый литерал впозиция [0] [0], как это

strcpy(tripleptr[0][0], "something");

, она отлично работает (то же самое для [0] [1] до [0] [3]), но

strcpy(tripleptr[1][0], "something");

не (это заставляет программу войти в Ошибка Сегментации).Что может быть причиной такого странного поведения?Я не могу найти ошибку индексации в части выделения памяти

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

следующий предложенный код:

  1. иллюстрирует, как должен выполняться блок кода
  2. указывает, сколько памяти фактически выделяется
  3. напоминает, чтоКод должен проверять на наличие ошибок
  4. указывает, как обработать ошибку, если она возникает

и теперь предлагаемый код:

//In this case size will always be 4
int size = countLines(file);
printf("size: %d\n", size);

char*** tripleptr = malloc(sizeof(*tripleptr)*size);

for(int i = 0; i < size; i++)
{
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size); // is 16 bytes each iteration, assuming a pointer is 4 bytes

    for(int k = 0; k< size; k++)
    {
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512); // is 4k bytes each iteration
    }
}

Примечание: дляустойчивость:

при вызове любой из функций выделения кучи: malloc(), realloc(), calloc(): всегда проверять (! = NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно.

В случае неудачи, наберите perror( "my error message" );, так как это выведет на stderr, и ваше сообщение об ошибке, и текстовую причину, по которой система считает, что произошла ошибка.И не забудьте передать каждый успешно выделенный указатель кучи памяти на free() перед выходом

0 голосов
/ 05 февраля 2019

Проблема в ваших циклах:

int i = 0, k = 0, j = 0;
for(; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}

Вы инициализировали i и k перед входом во вложенный цикл, но вы не сбрасываете k, когда внутренний цикл перезапускается наСледующая итерация.Это означает, что вы выделили память только для первого ряда строк.Таким образом, tripleptr[1][0] неинициализирован, и разыменование этого указателя дает вам неопределенное поведение .

Явная инициализация переменных управления циклом youf каждый раз:

int i, k;
for(i=0; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(k=0; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}
...