将char数组分配给函数的传递引用

时间:2014-07-01 07:20:09

标签: c argument-passing

我正在尝试创建一个程序,它将返回从text2.text文件中读取的值,但似乎它不会在* buffer指针上返回任何内容。当我尝试在checkValue函数中检查“buffer”中的字符串时,它会在text2.text中显示数据,但是当它返回到main函数时它不显示。有关如何将值传递给main函数的任何建议?谢谢。

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

typedef struct VALUE_READER
{
    char *result;
    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);
    }

}

3 个答案:

答案 0 :(得分:0)

你正在分配一个char *:

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

然后将此传递给checkValue。但是在checkValue中,你用你自己的新malloc内存覆盖了这个指针:

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

因此,在此之后编写的任何内存都是 缓冲区,它是您函数的本地缓冲区。您的选择是:

  1. 在函数
  2. 中再次使用提供给函数的缓冲区而不是malloc
  3. 传递char **而不是char *,然后你可以在调用者中填充指针,该内存是函数内的alloc。 e.g:

    checkValue(testFile,&amp; vr1-&gt; result,size_of_file);

  4. 然后在你的函数中:

    void checkValue(FILE *name_of_file, char **buffer, int size_of_file) 
    {
        ...
        *buffer = malloc(sizeof(char) * size_of_file);
        ...
    }
    

答案 1 :(得分:0)

您还没有为“vr1”创建一个“Value_reader”对象来引用。

主要()中的这个陈述“vr1-&gt; result =”是未定义的。你试图取消引用一个未初始化的指针 为“vr1”指针分配一个struct对象指向。将main中的行更改为:

vr1 = malloc(sizeof(Value_reader));

答案 2 :(得分:0)

您通过调用mainmalloc中分配缓冲区。然后将该指针传递给checkValue。在checkValue内部,您忽略传入的指针并分配新的缓冲区。你写入那个新的缓冲区,但是然后调用者无法看到你写的内容,因为你写了一个私有的缓冲区checkValue

或者:

  1. 写入调用者提供的缓冲区,或
  2. checkValue中分配缓冲区并将该缓冲区返回给调用者。