我正在这样做program来自 Hackerrank in C,我解决了该程序,而没有将我的字符数组“结果”声明为静态。它返回了一个错误,其中我的输出与预期输出不匹配。但是当我在数组“result”的声明中插入关键字“static”时,代码就成功运行了。
这是我的代码片段:
char* timeConversion(char* s)
{
int i;
static char result[100]; // this doesn't work if i remove the word 'static'
if (s[0]=='1' && s[1]=='2' && s[8]=='A')
{
result[0]='0';
result[1]='0';
for (i=2;i<8;i++)
result[i]=s[i];
}
else if (s[0]=='1' && s[1]=='2' && s[8]=='P')
for (i=0;i<8;i++)
result[i]=s[i];
else
{
if (s[8]=='A')
for (i=0;i<8;i++)
result[i]=s[i];
if (s[8]=='P')
{
result[0]=s[0]+1;
result[1]=s[1]+2;
for (i=2;i<8;i++)
result[i]=s[i];
}
}
return result;
}
我不明白,这里的Static有什么用?
最佳答案
有两件事:
您将从函数中返回堆栈分配数组的地址。如果它不是静态的,您只会返回一个不再存在的数组的地址,因为通常情况下,堆栈上的对象在超出范围时(即当函数返回时)会消失)。要从调用代码实际可以使用的函数返回数组,它必须在堆上分配(即使用
malloc
)或声明为static
,因为使用static
限定符声明的函数中的局部变量在函数返回后仍然存在。如果声明了没有
static
限定符的变量,但未显式初始化,则它只会获取当时内存中已有的内容。如果使用
static
限定符声明局部变量或数组,则它会隐式地用零进行初始化。这意味着变量result
可以用解析的日期/时间值填充,并且保证是一个以 null 结尾的字符串,因为数组中的所有元素都不是由函数已经为零。
关于arrays - Static 在声明字符数组时有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959880/