在C中输入大字符串

aka*_*jkn 3 c string memory-management

对于一个特定的问题,我必须从用户那里获取大小介于其间的字符串输入1 and 10^5.我使用了以下代码

char *a;
a = malloc(100000*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

并且在循环内(t指的是测试用例的数量)

while( t-- )
{
  scanf( "%d", &n );
  scanf( "%s", a );
  .....
}
Run Code Online (Sandbox Code Playgroud)

n是用户在运行时输入的字符串的长度.问题是这给了我"超出时间限制"

我对上面的代码做了一些修改,

 while( t-- )
 {
   scanf( "%d", &n );
   char a[n];
   scanf( "%s", a );
   ....
 }
Run Code Online (Sandbox Code Playgroud)

没有"TLE",这完全没问题.但我不明白为什么.使用第一个代码的原因是由于内存分配只进行一次,因此节省了时间.我错了吗?请解释.

Alf*_*ang 6

如果使用malloc,则会创建内存空间HEAP.

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

据我所知,堆栈比堆快.

参考:堆栈和堆的内容和位置是什么?


更重要的是,我认为char在循环外声明数组更合理:

char a[100000] = {};

while( t-- )
 {
   scanf( "%d", &n );
   scanf( "%s", a );
   ....
 }
Run Code Online (Sandbox Code Playgroud)

  • 如果循环中的`malloc`这将是一个不错的论点.它不是,因此......不是.它是单次分配,并且对一般算法贡献最差的O(1)复杂度. (3认同)