Нужно распечатать адрес, но получить содержимое - PullRequest
0 голосов
/ 21 января 2019

Я продолжаю пробовать разные конфигурации этого кода с "*", но не могу получить его для вывода адреса платы. Чего мне не хватает?

Нам нужно динамически выделить 2-й массив для карты. Я не могу изменить функциональную строку createMapBoard для проекта, и ** сбивает меня с толку.

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

char **createMapBoard(void)
{
    int i;
    char **board;

    board = malloc(8 * sizeof(char *));
    for(i = 0; i < 8; i++)
        board[i] = malloc(8 * sizeof(char));

    strcpy(board[0],"FF      ");
    strcpy(board[1]," F      ");
    strcpy(board[2]," FF     ");
    strcpy(board[3],"  F     ");
    strcpy(board[4],"  K     ");
    strcpy(board[5],"C  B    ");
    strcpy(board[6]," CC D   ");
    strcpy(board[7],"  C  DD ");

    return board;
}

int main()
{

char *pointer = *createMapBoard();
printf("Pointer: %s\n", pointer);
return 0;
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

У вас есть две проблемы здесь.Во-первых, спецификатор формата %s используется для печати строки.Если вы хотите напечатать значение указателя, используйте %p и приведите операнд к void *:

printf("Pointer: %p\n", (void *)pointer);

Во-вторых, вы присваиваете pointer фактически указатель напервая строка в доске, а не вся доска.Для этого вы хотите:

char **pointer = createMapBoard();

Затем вы можете рассматривать pointer как массив для перебора строк.

0 голосов
/ 21 января 2019

Изменить это:

printf("Pointer: %s\n", pointer); // "%s" is for printing string
                  ^

к этому:

printf("Pointer: %p\n", (void *)pointer); // "%p" is for printing pointer addresses
                                          // Note: cast to (void *) is optional for use with 
                                          // character types (but idiomatic),  and necessary 
                                          // for other types when using "%p" format specifier.
                  ^

Здесь есть шпаргалка для спецификаторов формата printf, включая один для адресов указателей .

Кстати, этот конкретный спецификатор формата также полезен для печати адреса других типов переменных при его использовании в сочетании с оператором & ( из ):

int int_var;

printf("This is the address of int_var: %p\n", (void *)&int_var);//note, (void *) cast is 
                                                                 //necessary here as its applied 
                                                                 //to non-character type.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...