与strcat相关的c中的分段错误

时间:2012-08-22 05:59:21

标签: c

当我尝试运行代码时出现分段错误,我已将其缩小到此块,但我不确定原因:

string myNewKey = "";

if (keylength < length){
    int myValue = ((length - keylength) / keylength) + 1;

    for (int i=0; i < myValue; i++)
        myNewKey = strcat(key, myNewKey);  
}

printf("%s", myNewKey);

我知道它与strcat有关,但我不确切知道是什么。

只是澄清一下。这不适合学校或工作。我只是想自己学习C语言,而且我正在学习哈佛大学的入门编程课程。

2 个答案:

答案 0 :(得分:2)

C没有名为string的标准类型,您没有向我们展示您是如何定义它的。

但是,我们可以猜测它类似于:

char *myNewKey = "";

if (keylength < length)
{
  int myValue = ((length - keylength) / keylength) + 1;
  for (int i = 0; i < myValue; i++)
      myNewKey = strcat(key, myNewKey);
}

printf("%s", myNewKey);

即使没有看到key的声明,我们也会看到麻烦。我们假设你有:

char key[100] = "a";

如果你经常迭代循环(再次,我们没有足够的信息来确定你要做什么 - 请刷新构成Short, Self-Contained, Correct (Compilable) Example的内容),那么你将溢出缓冲区迟早会导致麻烦,可能导致分段错误。

如果key也是string,就像我假设的myNewKey一样,那么你就会遇到各种各样的空间分配问题,而且你可能会写入只读内存(一种好方法)获得分段错误和核心转储。)

对于stringkeymyNewKey的其他定义(更不用说lengthkeylength),还有其他方法可以解决问题。

您应该在"%s\n"语句中的格式字符串(printf())的末尾添加换行符。没有它,你也不能保证及时看到输出(即使使用它,你可能也不会及时看到输出,但是在终端窗口中运行的程序通常会输出每一行作为结束它的换行符写的)。

答案 1 :(得分:2)

乔纳森也有同样的幻想:

strcat已经生成了append和modifies键,然后它返回一个指向key的指针。 你知道吗?

这意味着在第二步中你会得到相当于strcat(key,key)的东西,它可能足以导致分段错误(它取决于strcat实现)。

如果strcat(key,key)没有导致错误,将发生以下情况。

Staring key =“A”和myvalue为5,您将获得以下步骤:

  1. key =“A”,myNewKey =“A”
  2. key =“AA”,myNewKey =“AA”
  3. key =“AAAA”,myNewKey =“AAAA”
  4. key =“AAAAAAAA”,myNewKey =“AAAAAAAAA”
  5. key =“AAAAAAAAAAAAAAAA”,myNewKey =“AAAAAAAAAAAAAAAAA”
  6. 正如您可以在每个步骤中看到的那样,两个字符串的长度将呈指数增长。我不认为这就是你的意思。