Array.from({ length: 9 }, (_, i) => <Foo index={i} />)
我预计上面的代码会在达到空格之前获取字符。此外,我还有一些函数可以忽略文件中的空格并继续使用下一个我不在这里的字符,因为它们(在我看来)运行良好。这里的主要问题是,它没有从文件中获取字符,也没有将它们打包到数组中。程序崩溃或没有出现(如果成功)。
答案 0 :(得分:2)
返回指向局部变量的指针将不起作用,因为该数组不再在范围内。它是tok
,static
不是函数。
之后还有另一个错误
for(i=0; i<=(int)sizeof(tok)-1 &&isalpha(cc);++i)
如果将条件写成更惯用的
,则会更清楚i<(int)sizeof(tok)
对大脑的工作较少。现在很明显
tok[i]=0;
循环之后,当i == sizeof tok
写入超出数组边界时。
编辑更多关于循环控制。
您的-1
做事方式还有另一个危险。假设我在
size_t len = strlen(tok);
for(size_t i = 0; i <= len - 1; i++) { /*...*/ }
len == 0
会发生什么?
灾难,因为size_t
是无符号的,因此len - 1
将换行为该类型的最大值,并且会有一个巨大的循环。
现在,如果你以惯用的方式编写循环
size_t len = strlen(tok);
for(size_t i = 0; i < len; i++) { /*...*/ }
这不可能发生。
答案 1 :(得分:1)
问题是在函数getkw()
中,数组tok
是一个局部变量,因此当函数返回时释放内存。因此,您尝试返回的指针变为无效,并且当您尝试打印时程序崩溃。
要解决此问题,您必须使用malloc
动态分配内存并返回指针,或将指向数组的指针传递给函数并进行修改。
对于动态内存分配:
char* tok = malloc(10);
用于传递指向数组的指针:
static void getkw(char[] * array){
char[] tok = * array;
...
//no need to return anything, since you modify the passed array
}
int main()
{
char tok[10];
getkw(&tok);
...
}