使用strcat的内存分配细节

时间:2015-03-20 20:10:11

标签: c++ c

我正在使用以下代码来打印字符串。

#include<bits/stdc++.h>

using namespace std;

int main(){
  char s[100];
  while(1){
     char f[10000];
     cin>>s;
     strcat(f,s);
     cout<<f<<endl;
  }
  return 0;
}

在每次迭代中,完成f字符数组的新分配。

输入

a

b

c

d

我预计输出会是这样的:

a

b

c

d

但实际输出是:

a

ab

abc

abcd

为什么会这样?虽然我在每次迭代中声明一个新数组 那么为什么这种输出呢?

1 个答案:

答案 0 :(得分:3)

因为:未定义的行为。

您没有初始化阵列。你只是在声明它。只因为你宣布

 char f[10000];

并不意味着它会自动初始化为空数组。

因此,您将获得一个声明的数组,其中包含随机数据。

此时,您不能指望获得任何可预测的行为。你得到的结果将是一个合理的结果。但不是唯一的一个。

编辑:每次循环时,数组最终都在堆栈上的相同位置。第一次,您的操作系统为堆栈设置了一个新页面,清除为0.您strcat()编辑了您的字符串。下一次循环,你的旧数据,从上一次迭代,仍然存在。所以,你strcat()更多东西,将它追加到最后。