我试图返回一个二维数组,但它并没有真正分配给str变量。有人能引导我找出我做错了什么吗?
int main()
{
char** str = OpenFile();
//reverseString(str);
return 0;
}
char** OpenFile() {
char line[HEIGHT][LENGTH];
char *fname = "test.txt";
FILE *fptr = NULL;
int i = 0;
fptr = fopen(fname, "r");
while(fgets(line[i], LENGTH, fptr))
{
line[i][strlen(line[i]) - 1] = ' ';
i++;
}
return line;
}
char line[HEIGHT][LENGTH];
数组变量行[][]在OpenFile((函数中被声明为局部变量。因此,一旦OpenFile((完成执行,它就会超出作用域。您可以将行[][]声明为全局行,也可以将其作为参数传递给函数。
从函数返回指向具有自动存储持续时间的本地对象的指针会使指针无效,因为本地对象在退出函数后将不活动。
其次,类型char**
(显示函数的返回类型(和类型char ( * )[LENGTH]
(返回表达式的类型(不同。
您可以在函数中动态分配一个数组并返回它
例如
char (* OpenFile() )[LENGTH] {
char ( * line )[LENGTH] = malloc( HEIGHT * sizeof( char[LENGTH] ) );
//...
retirn line;
}
这种方法是灵活的,因为如果需要,可以在函数中重新分配数组。
或者,您可以使用存储说明符static(如(来定义阵列
char (* OpenFile() )[LENGTH] {
static char line[JEIGHT][LENGTH];
//...
retirn line;
}
注意这句话
line[i][strlen(line[i]) - 1] = ' ';
不安全。函数fgets没有必要在输入的字符串后面添加换行符'n'
。一种安全的方法是以下
line[i][ strcspn( line[i], "n" ) ] = ' ';