Двойной указатель (**)
Всем привет! У меня такая история. У меня есть двойной указатель на двумерный массив строк. Я написал функцию, которая должна бы выписывать нужное имя(в данном случае "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);
}
Выделяем память под двумерные массивы правильно. Выделим одним блоком память (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;
}