char ** массив c файлом ввода pgm

У меня есть некоторые проблемы с символом ** с вводом файла. Я делаю проект, где мы манипулируем файлами PGM. Я пытаюсь получить заголовок из файла, используя символ **, но все, что он делает, это возвращает ноль. Он будет проходить через код, который у меня есть, получить размеры и вернуть их на экран, но когда я пытаюсь напечатать заголовок, я просто получаю (null) как мой вывод

// Создание символа **

char **header=(char**)malloc(2*sizeof(char*));

// Ввод файла

FILE * fin;
fin=fopen(argv[1], "rb");
fscanf(fin, "%s", *header);
printf("%s", header[0]);
fclose(fin);

Я не уверен на 100%, если я создаю header правильно или нет, или если я печатаю header тоже верно. Любая помощь приветствуется.

2 ответа

malloc(2*sizeof(char*)); выделяет достаточно памяти для 2-х символьных указателей. Этого, вероятно, будет недостаточно, чтобы держать заголовок.

На самом деле, глядя на спецификацию pgm, кажется, что 2 символа будут содержать "магическое число", но вам все равно потребуется выделить 3 символа, чтобы вы могли держать завершающий NULL, который fscanf будет производить.

Так что попробуйте избавиться от одного уровня косвенности:

char *header=malloc(3*sizeof(char));
char *header = malloc(2*sizeof(char));
fscanf(fin, "%s", header);

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

Edit - указатель косвенности

Мы используем указатели для указания на выделенную память - это то, что происходит с *header = malloc..., Мы также используем указатели для передачи аргументов функциям, значения которых мы хотим изменить, поэтому, если вам нужно выделить char * внутри другой функции и чтобы вызывающая сторона знала об этом, вам нужно использовать указатель на указатель: char **,

Другие вопросы по тегам