-3

当我尝试运行我的代码时遇到分段错误,我已将其范围缩小到此块,但我不知道为什么:

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,我正在关注哈佛的编程入门课程的公开课程讲座。

4

2 回答 2

2

与乔纳森相同的假设:

strcat 已经进行了追加和修改键,然后它返回一个指向键的指针。你知道吗?

这意味着在第二步中,您将获得等效的 strcat(key,key) 可能足以导致分段错误(这取决于 strcat 实现)。

如果 strcat(key,key) 没有导致故障,则会发生以下情况。

Staring key = "A" 和 myvalue 5 你会得到以下步骤:

  1. 键 = “A”,myNewKey = “A”
  2. 键 = “AA”,myNewKey = “AA”
  3. 键 = “AAAA”,myNewKey = “AAAA”
  4. 键 = “AAAAAAA”,myNewKey = “AAAAAAAAA”
  5. 键 = “AAAAAAAAAAAAAAAA”,myNewKey = “AAAAAAAAAAAAAAAA”

正如您在每一步中看到的那样,两个字符串的长度会呈指数增长。我不认为那是你的本意。

于 2012-08-22T06:43:39.003 回答
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";

如果您足够频繁地迭代循环(同样,我们没有足够的信息来确定您在做什么——请复习一下构成简短、自包含、正确(可编译)示例的内容),那么您迟早会溢出缓冲区,这将导致麻烦并可能导致分段错误。

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

对于 和 的其他定义(更不用说和) string,还有其他遇到问题的方法。keymyNewKeylengthkeylength

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

于 2012-08-22T06:13:45.430 回答