Задать вопрос
@HesCodi

Почему при выделении динамической памяти она не выделяеться и странно работает?

Я хотел создать простенькое приложение на С, Как когда я только учился написал его на с#.
Пока что приложение только читает из файла строчки. Но проблемы возникают когда- цыкл фор начинает идти по второму разу, Во-второй раз память для **ptext не добавляется и я не знаю что делать.
А еще количество символов в выделе ной памяти почему-то не равно 2 байтам, а может свободно гулять.
Я не знаю что мне с этим сделать и почему память выделеная *alloc такая странная.
Я ставил проверки на NULL(которые не срабатывали, и я вернул как и было), но я не думаю что у меня в пк не найдется 3 байтов.

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

#define _CRT_SECURE_NO_WARNINGS

FILE* create_filestream(const char* filepath, char* buffer);
int read_text_in_file(FILE* filestream, char*** ptext, size_t* text_size);

int main() {
	char buffer[32];
	FILE* f = create_filestream("map.txt", &buffer);

	char **text;
	size_t text_size = NULL;

	read_text_in_file(f, &text, &text_size);
}
  
int read_text_in_file(FILE* filestream, char*** ptext, size_t* text_size){
	char buffer[32],* data = NULL;

	size_t bytes_read, nums = 0, j = 0;
	*text_size = 0;
	
	*ptext = malloc(sizeof(char**));
	**ptext = malloc(sizeof(char*));

	while (!feof(filestream)) {
		bytes_read = fread(&buffer, sizeof(char), sizeof(buffer), filestream);
		
		if (ferror(filestream) || bytes_read == 0) return -1;

		for (size_t i = 0; i < bytes_read; i++) {
			if (buffer[i] == '\0') {
				nums++;
				j = 0;
				if(*ptext = (char**)realloc(*ptext, sizeof(*ptext) + sizeof(char**)))
					return -2;
				continue;
			}

			(*text_size)++;
			
			data = realloc(data, *text_size * sizeof(char));
			data[*text_size - 1] = buffer[i];

			**ptext = (char*)realloc(*ptext, (sizeof(**ptext) + sizeof(char*)));
			
			*ptext[nums][j] = data[*text_size - 1];

			j++;
		}
	}
	printf((*ptext)[0]);

	return 0;
}

FILE* create_filestream(const char* filepath, char* buffer) {
	FILE* file;
	
	file = fopen(filepath, "r+");

	if (setvbuf(file, buffer, _IOFBF, sizeof(buffer)) != 0) {
		fclose(file);
		file = NULL;
		return (FILE*)NULL;
	}

	return file;
}
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Furax
Ваш вопрос не по C++, а по C, это разные языки.

sizeof(buffer) в функции create_filestream() вернёт размер указателя (4 или 8 байт), а не размер буфера buffer из функции main, т. к. функция create_filestream про него ничего не знает. Скорее всего, это не то, чего Вы хотите.

Строка "if(*ptext = (char**)realloc(*ptext, sizeof(*ptext) + sizeof(char**)))", по-видимому, должна к текущему размеру данных, ассоциированных с *ptext, добавлять размер ещё одного указателя. По факту sizeof(*ptext) - это размер char**, т. е. размер указателя, т. е. у Вас всегда будет здесь или 8 байт (сумма размеров двух указателей на 32-битной платформе), или 16 (на 64-битной). Получить размер массива, который в данный момент ассоциирован с указателем, оператором sizeof() нельзя и в общем случае вообще нельзя, его нужно хранить отдельно.

Перечитайте внимательно главу про обращение с указателями. Пока у Вас каша, которая вряд ли будет работать ожидаемым образом. Нужно чётко понимать, что такое char*, char**, char***, sizeof(ptext), sizeof(*ptext) и т. д.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы