#c #argument-passing
#c #передача аргумента
Вопрос:
Я пытаюсь создать программу, которая вернет значение, прочитанное из файла text2.text, но, похоже, оно ничего не возвращает в указателе буфера *. Когда я пытаюсь проверить строку внутри «буфера» в функции checkValue, она отображает данные внутри text2.text, но когда она возвращается к функции main, она не отображается. Есть предложения, как я мог бы передать значение в основную функцию? Спасибо.
#include <stdio.h>
#include <stdlib.h>
typedef struct VALUE_READER
{
char *resu<
char *fileName;
char *sectionName;
char *keyName;
} Value_reader;
void checkValue(FILE *name_of_file, char *buffer, int size_of_file)
{
int i;
char holder[size_of_file];
buffer = malloc(sizeof(char) * size_of_file);
printf("%d n",size_of_file);
for (i = 0; i < size_of_file; i ) {
holder[i] = fgetc(name_of_file);
if (holder[i] == EOF)
break;
}
holder[i] = 0;
for (i = 0; i < size_of_file; i )
*(buffer i) = holder[i];
}
int main()
{
Value_reader *vr1;
FILE *testFile;
int size_of_file;
testFile = fopen("test2.txt", "r");
fseek(testFile, 0, SEEK_END);
size_of_file = ftell(testFile);
fseek(testFile, 0, SEEK_SET);
if (NULL == testFile) {
printf("File not found!n");
}
else {
vr1->result = malloc(sizeof(char) * 400);
checkValue(testFile, vr1->result, size_of_file);
printf("nThe data inside are:n"%s"n", vr1->result);
free(vr1->result);
fclose(testFile);
}
}
Комментарии:
1. В функции
checkValue
удалите строкуbuffer = malloc(sizeof(char) * size_of_file);
. И в функцииmain
измените константу400
наsize_of_file
.
Ответ №1:
Вы выделяете буфер в своем main
с помощью вызова malloc
. Затем вы передаете этот указатель checkValue
. Внутри checkValue
вы игнорируете переданный указатель и выделяете новый буфер. Вы записываете в этот новый буфер, но тогда вызывающий объект не сможет увидеть, что вы написали, потому что вы записали в буфер, закрытый для checkValue
.
Либо:
- Запись в буфер, предоставленный вызывающим объектом, или
- Выделите буфер в
checkValue
и верните этот буфер вызывающей стороне.
Ответ №2:
Вы выделяете символ*:
vr1->result = malloc(sizeof(char) * 400);
Затем передаем это в checkValue . Однако внутри checkValue вы перезаписываете этот указатель своей собственной новой malloc’d памятью:
buffer = malloc(sizeof(char) * size_of_file);
Таким образом, любая запись в память, которую вы выполняете после этого момента, выполняется в тот буфер, который является локальным для вашей функции. Ваши варианты:
- Используйте буфер, предоставленный функции, а не malloc снова внутри функции
-
Передайте символ ** вместо символа*, тогда вы можете заполнить указатель в вызывающем объекте памятью, которая выделена внутри функции. например:
Контрольное значение(testFile, amp;vr1->результат, size_of_file);
тогда в вашей функции что-то вроде:
void checkValue(FILE *name_of_file, char **buffer, int size_of_file)
{
...
*buffer = malloc(sizeof(char) * size_of_file);
...
}
Ответ №3:
Вы не создали объект «Value_reader» для ссылки на «vr1».
И это утверждение «vr1-> result = » в main() не определено. Вы пытаетесь отменить ссылку на неинициализированный указатель.
Выделите объект struct для указателя «vr1», на который он будет указывать. Измените строку в main на:
vr1 = malloc(sizeof(Value_reader));