Присвоение массива символов переданной ссылке на функцию

#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 .

Либо:

  1. Запись в буфер, предоставленный вызывающим объектом, или
  2. Выделите буфер в checkValue и верните этот буфер вызывающей стороне.

Ответ №2:

Вы выделяете символ*:

 vr1->result = malloc(sizeof(char) * 400);
  

Затем передаем это в checkValue . Однако внутри checkValue вы перезаписываете этот указатель своей собственной новой malloc’d памятью:

 buffer = malloc(sizeof(char) * size_of_file);
  

Таким образом, любая запись в память, которую вы выполняете после этого момента, выполняется в тот буфер, который является локальным для вашей функции. Ваши варианты:

  1. Используйте буфер, предоставленный функции, а не malloc снова внутри функции
  2. Передайте символ ** вместо символа*, тогда вы можете заполнить указатель в вызывающем объекте памятью, которая выделена внутри функции. например:

    Контрольное значение(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));