【问题标题】:*** stack smashing detected ***: <unknown> terminated Aborted (core dumped)*** 检测到堆栈粉碎 ***: <unknown> 终止 Aborted (core dumped)
【发布时间】:2018-11-18 17:22:14
【问题描述】:

我正在尝试编写一个程序来读取一个包含 15 个元素的数组,并为每种数字仅输出一次该数组中的数字(不会输出重复)。我在标题中收到错误,我不知道为什么。这是我的代码:

#include <stdio.h>

void main () {

    int initial[15], final[15], nf=1, aux;

    printf("Insert the 15 elements:\n");

    for (int i = 0; i < 15; ++i)
    {
        printf("Insert the %dº element:\n",i+1);
        scanf("%d", &initial[i]);
    }

    final[0]=initial[0];

    for (int i = 1; i < 15; ++i)
    {

        for (int k = 0; k < nf ; ++k)
        {   
            if (initial[i]!=final[k]) {

                final[nf]=initial[i];
                nf++;
            }
        }
    }

    for (int c = 0; c < nf ; ++c)
    {
        printf("%d, ",final[c]);
    }

}

【问题讨论】:

  • 你用什么编译器?哪个版本?你试图理解你的问题是什么?在调试中你能找到什么?
  • 写入超出本地数组范围的典型症状。
  • 添加printf 以观察nf 的值,因为您正在递增它。我敢打赌它会在某个时候达到15
  • 建议使用调试器仔细查看循环中的变量。 (对我来说,控制台打印只是石器时代的调试)
  • @Asu 尝试了你的建议,确实,nf 达到了 85。但只有当初始数组中的数字与最后一个数组中的数字不同时,它才会增加,对吧?

标签: c


【解决方案1】:

你的内循环逻辑有缺陷。当元素不同时,条件 initial[i]!=final[k] 将得到满足,这不是您想要的。您想检查initial[i] 是否存在于final 数组中。

for (int i = 1; i < 15; ++i)
{
    bool found = false;
    for (int k = 0; k < nf ; ++k)
    {
        if (initial[i]==final[k]) {
            found = true;
            break; // Found a dup, no need to continue further.
        }
    }

    // Not present in final array, so include it.
    if (!found) final[nf++] = initial[i];
}

【讨论】:

    【解决方案2】:

    在不考虑您真正想对阵列做什么的情况下,下面解释了一些潜在的缺陷。 您会在调试模式下看到 knf 值变化时的清晰显示。或者使用控制台打印。

    for (int k = 0; k < nf ; ++k) { // risky algorithm: k used as index of array, with no array bound check
        if (initial[i]!=final[k]) { // risk here with k, uncheked array index: what if k > array length ?
            final[nf]=initial[i]; //  risk here with nf, uncheked array index: what if nf > array length ?
            nf++; // risky algorithm: for loop stop condition is changed at each iteration
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个算法。希望它可能会起作用:

      def firstNonRepeating(arr, n): 
      
      for i in range(n): 
          j = 0
          while(j < n): 
              if (i != j and arr[i] == arr[j]): 
                  break
              j += 1
          if (j == n): 
              return arr[i] 
      
      return -1
      

      【讨论】:

        猜你喜欢
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多