【问题标题】:Input large strings in C在 C 中输入大字符串
【发布时间】: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


【解决方案1】:

如果你使用malloc,内存空间会在HEAP上创建。

在第二个实现中,内存位于STACK

据我所知,栈比堆快。

参考:What and where are the stack and heap?


此外,我认为在循环外声明char 数组更合理:

char a[100000] = {};

while( t-- )
 {
   scanf( "%d", &n );
   scanf( "%s", a );
   ....
 }

【讨论】:

  • 如果malloc 在循环中,这将是一个不错的论点。它不是,因此它……不是。它是单次分配,并且对一般算法的复杂度最低为 O(1)。
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多