【发布时间】:2014-07-05 05:48:28
【问题描述】:
对于特定问题,我必须从用户那里获取字符串输入,其大小可以在 1 and 10^5 之间。
我使用了以下代码
char *a;
a = malloc(100000*sizeof(char));
在一个循环内(t指测试用例的数量)
while( t-- )
{
scanf( "%d", &n );
scanf( "%s", a );
.....
}
n 是用户在运行时输入的字符串的长度。问题是这给了我“超出时间限制”
我对上面的代码做了一些改动,
while( t-- )
{
scanf( "%d", &n );
char a[n];
scanf( "%s", a );
....
}
如果没有 "TLE" ,这工作得很好。但我不明白为什么。使用第一个代码的原因是可以节省时间,因为内存分配只进行一次。我错了吗? 请解释一下。
【问题讨论】:
-
谁给出了“超出时间限制”的错误?我认为这不是您的 C 代码的问题,而是您使用的平台的问题。
-
如果在第二个 sn-p 中读取为
a的字符串确实是n字符宽,那么您正在分配一个(终止符)。其次,在第二种情况下没有“动态”运行时分配。它实际上是sub esp,n。如果我猜的话,避免 TLE 可能与您的分配不足直接相关,导致缓冲区溢出和覆盖t将其设置为终止符(即 0),从而在单次迭代后结束循环。 -
次要:使用 `a = malloc(100000 + 1);
-
“超过时间限制”在 www.codechef.com 中给出...第二个 sn-p 工作得非常好。第一个 sn-p 是给 Time Limit Exceeded...
标签: c string memory-management