Двойной указатель (**)

Всем привет! У меня такая история. У меня есть двойной указатель на двумерный массив строк. Я написал функцию, которая должна бы выписывать нужное имя(в данном случае "misa"), но вместо этого она принтует мне 0. Сложно разобраться с указателями (да и еще двойными, да и еще на двумерный массив!). Был бы очень рад, если кто-нибудь помог бы мне в этом деле. Наперед благодарен!

Код

#include <stdio.h>

void print_name(char** array, const int num) {
    printf("%d\n", *array[num]);
}

int main()
{
    char* names[3][4];

    names[0][0] = "kola";
    names[1][0] = "vasa";
    names[2][0] = "misa";

    print_name(*names, 2);

    return 0;
}

upd: Если я вывожу строку "%s", то мне показывает такое сообщение

format ' s' expects argument of type 'char *' but argument 2 has type 'int ' -wformat=

и выводит (null)


Ответы (2 шт):

Автор решения: вася
#include <stdio.h>


void print_name(const char* array[3][4], size_t num) {
    printf("%s\n", array[num][0]);
}


int main(void) {
    const char* names[3][4];

    names[0][0] = "kola";
    names[1][0] = "vasa";
    names[2][0] = "misa";

    print_name(names, 2);
}
→ Ссылка
Автор решения: DSuhoi

Выделяем память под двумерные массивы правильно. Выделим одним блоком память (malloc) и под указатели на указатели (N*sizeof(char*)) и под указатели на символы (M*N*sizeof(char)). Очистка памяти,выделенной подобным способом, производится с помощью одной функции free. (+можно передавать в параметры к функции лишь указатели - функция print_name_1). Пример:

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


#define N 3 //кол-во строк
#define M 5 //кол-во символов в строке (4 символа + '\0' для разделения строк в памяти

void print_name(char** array, const int num) {
    printf("%s\n", array[num]);
}

//или так
void print_name_1(char* array, const int num) {
    array += M*num;
    printf("%s\n", array);
}

int main()
{
    //char* names[3][4];
    //выделяем память правильно!
    char **names = (char**) malloc(N*sizeof(char*) + M*N*sizeof(char));
    names[0] = (char*) (names + N); //указатель на первый символ
    for(size_t i=1; i<N; i++)
        names[i] = names[0] + M*i;  //смещаем указатель под начало строк
    
    //используем функцию strcpy из <string.h>
    strcpy(names[0],"kola");
    strcpy(names[1],"vasa");
    strcpy(names[2],"misa");
    
    
    print_name(names, 2);
    
    print_name_1(names[0], 0);
    
    free(names);    //освобождаем память одной функцией free
    
    return 0;
}
→ Ссылка