Нечетный вывод, выделяющий двумерную матрицу в С - PullRequest
0 голосов
/ 14 октября 2018

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

Вот как я это делаю:

adjMatrix = (char **) malloc(sizeof(char *) * dimensions);

for (int i = 0; i < dimensions; i++)
    adjMatrix[i] = (char *) malloc(sizeof(char) * (dimensions + 2));

for (int i = 0; i < dimensions; i++)
    for (int j = 0; j < (dimensions + 2); j++)
        adjMatrix[i][j] = '0';

Вот моя функция отображения:

    for (int i = 0; i < dimensions; i++)
    {
        for (int j = 0; j < (dimensions + 2); j++)
            printf("%s ", &(adjMatrix[i][j]));

        printf("\n");
    }

И это мой вывод

000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 

Может ли кто-нибудь объяснить мне, почему он так показывает, и датьЛюбой совет, как сделать это просто один '0' в каждом слоте?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Может ли кто-нибудь объяснить мне, почему это так показывается

Краткий ответ - "неопределенное поведение", потому что

1) вы пытаетесь напечатать что-то, что не строка, использующая %s (для которой требуется строка, то есть массив символов, содержащий нулевое окончание '\0').

2), который вы читаете за пределами как printf с%s будет продолжать читать, пока не увидит завершение строки.

Из-за неопределенного поведения можно сказать, что нет смысла гадать о том, что происходит.

Если мы все равно это сделаем, это может быть что-то вроде:

Вы используете 6 столбцов и инициализируете их в «0», чтобы память была

 '0' '0' '0' '0' '0' '0'

имы не можем сказать, что находится после последнего «0».По «удаче» кажется, что следующая ячейка памяти содержит строковое окончание.Например:

 '0' '0' '0' '0' '0' '0' '\0'
                          ^^
                          A guess...

Теперь вы печатаете его в виде строки, используя %s (и добавляя пробел).

При первой передаче указателя на первый '0'.

 '0' '0' '0' '0' '0' '0' '\0'
  ^
  pointer

, поэтому он выдаст вам отпечаток 6 '0' (и пробел).

Затем вы перемещаете указатель вправо и снова вызываете printf

 '0' '0' '0' '0' '0' '0' '\0'
      ^
      pointer

, поэтому он даст вам отпечаток 5 '0'

Следующие циклы дадут 4 '0', затем 3, затем 2, затем 1, и вы получите

000000 00000 0000 000 00 0

Но опять же - поскольку это действительно неопределенное поведение, это просто предположение.Все могло произойти.

0 голосов
/ 14 октября 2018

Может ли кто-нибудь объяснить мне, почему это так, и дать какой-нибудь совет относительно того, как сделать так, чтобы в каждом слоте было только один '0'?

Это потому, что высоветуем напечатать строку, а не один символ.

Измените код на:

printf("%c ", adjMatrix[i][j]);

Обратите внимание, adjMatrix[i] указывает на массив из отдельных символов, а массив символов являетсястрока.Кроме того, это неопределенное поведение, потому что вы не 0 завершаете «строку».

&adjMatrix[i][0] - указатель на '0' '0' '0' '0' '0' '0',
&adjMatrix[i][1] - указатель на '0' '0' '0' '0' '0',
&adjMatrix[i][2] - указатель на '0' '0' '0' '0',
...

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