Ошибка: указатель разыменования вне границ - PullRequest
0 голосов
/ 30 мая 2019

Учитывая приведенный ниже код, я получаю следующую ошибку во время выполнения

FATAL RUN-TIME ERROR: строка 21, столбец 11, идентификатор потока 0x00002068:
Разыменение за пределамиуказатель: 1 байт (1 элемент) за концом массива.

Что я здесь не так делаю?Я создаю двумерный массив символов и инициализирую все элементы как 'x'.Затем я пытаюсь распечатать все элементы, используя логику указателя.Он печатает символы в стандартный ввод-вывод, но затем выдает ошибку времени выполнения.Я не вижу, где происходит выход за пределы.

#include <stdio.h>
#define EDGE 10

int main(void){

    char fabric[EDGE][EDGE];
    char *cell = fabric;
    int totalCells = EDGE*EDGE;

    for(int i = 0; i < totalCells; ++i){    
            *(cell + i) = 'x';
    }

    cell = fabric; //set cell to point back to first element

    while(*cell){                  //while there is content at address, print content
        printf("%c", *cell);
        ++cell;
    }

    getchar();
    return 0;

}

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Настоятельно рекомендуем вам просто использовать malloc / memset вместо хакерских указателей.

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

#define EDGE        ( 10 )
#define TOTAL_CELLS ( EDGE * EDGE )

int main()
{
    int i;
    char * fabric = malloc(TOTAL_CELLS);
    memset(fabric,'x',TOTAL_CELLS);


    for(i=0; i<TOTAL_CELLS; i++){
        printf("%c",fabric[i]);
    }

    return 0;
}

Если вы по-прежнему хотите ссылаться на 2D-массивную структуру (fabric[i][j]), вы можете сделать это в одномерном массиве так же легко (fabric[i*EDGE+j]), и вам будет проще манипулировать этим линейным блоком памяти.

0 голосов
/ 30 мая 2019

Прежде всего, массив не содержит строки. Так что это условие

while(*cell){ 

приводит к неопределенному поведению.

Также вы должны использовать указатели в объявлении и в заявлении

char *cell = ( char * )fabric;

cell = ( char * )fabric;

потому что не существует неявного преобразования из типа char ( * )[EDGE] в тип char *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...