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 **
,