我想逐行读取一个简单的文件,并将内容保存到一个数组中.如果我编译源代码,我会收到此错误:
test.C: In function ‘char* read_file(int, int, const char*)’:
test.C:14:11: error: cannot convert ‘char (*)[1024]’ to ‘char*’ in return
return words;
^
Run Code Online (Sandbox Code Playgroud)
这是什么意思?为什么我不能返回2D数组的指针?这是源代码.
#include <stdio.h>
#include <string.h>
char * read_file(int buf, int size, const char *fname){
char words[size][buf];
FILE *fptr = NULL;
int idx = 0;
fptr = fopen(fname, "r");
while(fgets(words[idx], buf, fptr)) {
words[idx][strlen(words[idx]) - 1] = '\0';
idx++;
}
return words;
}
int main(void) {
char * words;
words = read_file(1024, 100, "text.txt");
int i;
for(i = 0; i < 100; ++i)
printf("%s\n", words[i]);
}
Run Code Online (Sandbox Code Playgroud)
你实际上有两个问题:第一个是关于错误.数组的数组与char指向的数组不同char.当数组衰减为指针时,数组的数组char相当于指向数组的指针char,或者char (*)[buf]在您的特定情况下.
第二个问题更糟糕,那就是你试图返回一个指向局部变量的指针.一旦函数返回,局部变量就会超出范围,并且基本上不再存在.因此,一旦函数返回,指针就不再有效.
由于您使用可变长度数组,因此您需要的一种解决方案是动态分配数组,作为指向指针的指针char,即char **返回它.另一种解决方案是将数组作为参数传递.
在我看来,最简单的解决方案是在main函数中声明数组并将其传递给函数,这样您就不必费心去处理指针和动态分配,更具体地说,以后可以释放内存.
像这样的东西:
#define STRING_COUNT 100 // Number of strings
#define STRING_SIZE 1024 // Size of each string
// Open and read the file, returns the number of "words" read
size_t read_file(const char *filename, char (*words)[STRING_SIZE])
{
// Implement the function...
// Don't forget to return the number of "words", actually lines, you read
}
int main(void)
{
char words[STRING_COUNT][STRING_SIZE];
size_t number_words = read_file("test.txt", words);
// Use the "words" here...
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)