将函数返回的数组赋值给c

时间:2016-04-11 23:34:46

标签: c arrays

我无法将从函数返回的字符数组分配给main中的变量。

char *read(char filename[]) {
    int i = 0;
    am = 0;
    char line[80];
    char *record[100];
    FILE *infile;
    infile = fopen(filename, "r");

    while (fgets(line, sizeof line, infile) != NULL) {
        record[i] = strdup(line);
        i++;
        am++;
    }
    return record;
}
...

int main() {
    char input[100];
    char *record[100];
    char input2[100];
    char input3[100];
    while (1) {
        scanf("%[^\n]%*c", &input);
        strcpy(input2, strtok(input, " "));
        if (strcmp(input2, "print") == 0){
            print(record);

        ...

        else if (strcmp(input2, "read") == 0) {
            strcpy(input3, strtok(NULL, " "));
            record = read(input3); //input3 is the file name
        }
    return 0;
}

我想采用" read"给出的字符数组。并将其传递给" print",但我没有成功。不会有错误的输入。

编辑:我尝试过动态分配,但我仍然没有得到我想要的东西。我做错了吗?

char* read(char filename[]) {
    int i = 0;
    am = 0;
    char line[80];
    char *record = calloc(100, sizeof(char));
    if (record == NULL) return NULL;
    FILE *infile;
    infile = fopen(filename, "r");

    while (fgets(line, sizeof line, infile) != NULL) {
        printf(line);
        record[i] = strdup(line);
        i++;
        am++;
    }
    return record;
}

1 个答案:

答案 0 :(得分:0)

您的问题是变量record,声明为char * record[100];

当您声明[100]时,您正在堆栈上创建存储。堆栈存储仅在包含它的函数仍在范围内时才有效。 (例如,您可以将record向下传递到从read()内调用的其他函数。)

因此当read()返回记录时,它返回一个指向数组开头的指针。但是数组本身不再有效,因为read() - 包含record的函数 - 不再在范围内。

您可以通过创建record的文件范围存储(文件范围的变量)版本来解决此问题;或者使用动态分配(例如malloccalloc)在堆上为record创建存储空间;或者将record的存储空间从read()传递到main()

通常可以这样做的方法是使用动态分配来创建堆存储,然后返回它。请注意,如果您这样做,则进入所有权语义领域 - 您必须决定谁拥有存储,谁将释放您分配的存储。

另请注意strdup()本身使用动态内存分配来制作缓冲区的副本。即使你没有意识到,你已经在做一些这样的事了。 : - )