【问题标题】:Recursion in C, segfault confusionC中的递归,段错误混淆
【发布时间】:2016-05-08 21:21:48
【问题描述】:
#include <stdio.h>

#define ARRAY_LEN   45

int howmany (int table[] , int number , int frequency , int index) {

    if (index <= ARRAY_LEN) {

        if (table[index] == number) {
            frequency++;
        }
        howmany(table , number , frequency , index++);

    }
    return frequency;
}

int main(void) {
    int array[] = {9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,4,5,6,7,8,9,9,8,7,6,5,6,7,8,9,9,8,7,8,9,9};
    int frequency = 0;
    int chosen;

    printf("Select chosen number\n");
    scanf("%d" , &chosen);

    frequency = howmany(array ,chosen ,frequency , 0);

    printf("Frequency of %d is %d times.\n" , chosen , frequency);

    return 0;
}

所以我明天有一个考试,我遇到了这个简单的程序的问题,该程序用递归计算一个数字在表中找到的次数。请帮助我找到问题,因为调试器在我调用函数 howmany 的行中发现了问题,但是我似乎无法检测到它是什么。谢谢

【问题讨论】:

  • 这个程序有什么问题?你期望它做什么?它实际上是做什么的?
  • 考虑index++ 的值是多少。它是index 在递增之前的原始值,这意味着您在所有调用中看到index 的相同值。段错误意味着程序的堆栈空间不足。在这里,您实际上并不需要在函数中增加 index。说出你的意思:index + 1.
  • howmany递归调用howmany时,为什么会把返回值扔掉呢?那有什么用?为什么将frequency 传递给howmany?为什么不只是让它返回频率?没有 cmets,很难理解这段代码。
  • 病得很厉害,试着解释一下。该表有 45 个数字,howmany 函数试图找出变量数字在表中存在的次数。索引变量用于在表中作为计数器运行,这就是我增加它的原因。所以我检查了桌子的每个位置,直到 44 位。
  • ΥΕΑΗ M.Oehm 你是对的,谢谢 :) 我没有注意到它是后缀,谢谢!另外关于频率的返回,我实际上返回了它,我只是在修复它之前上传了该程序的早期版本。谢谢大卫·施瓦茨。

标签: c arrays recursion segmentation-fault


【解决方案1】:

您的函数太复杂和错误。

对于初学者,具有例如 45 元素的数组的有效索引范围是 0-44

或在本次通话中

howmany(table , number , frequency , index++);
                                     ^^^^^^^

变量index的当前值被传递给函数,而不是像例子中增加的值

howmany(table , number , frequency , ++index);
                                     ^^^^^^^^

而且变量frequency不会累加变量number的值在数组中出现的次数。

函数可以简单写成一行。

这是一个演示程序。

#include <stdio.h>

size_t how_many ( const int a[] , size_t n, int value ) 
{
    return n == 0 ? 0 : ( a[0] == value ) + how_many( a + 1, n - 1, value );
}

int main( void ) 
{
    int a[] = 
    {
        9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 
        8, 9, 9, 8, 7, 6, 5, 4, 3, 4, 5, 6, 7, 8, 9,
        9, 8, 7, 6, 5, 6, 7, 8, 9, 9, 8, 7, 8, 9, 9
    };
    const size_t N = sizeof( a ) / sizeof( *a );

    int chosen;

    printf( "Select chosen number: ");
    scanf( "%d" , &chosen );

    size_t frequency = how_many( a, N, chosen );

    printf( "Frequency of %d is %zu times.\n" , chosen , frequency );

    return 0;
}

程序输出可能看起来像

Select chosen number: 7
Frequency of 7 is 7 times

.

【讨论】:

  • 刚刚说我在上传程序后做了一些修复,但感谢您的解决方案。
  • @ΣωτήρηςΕυαγγέλου 完全没有。我们,初学者,应该互相帮助。:)
  • 我猜是@VladfromMoscow ^^
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2018-03-30
  • 2015-09-18
相关资源
最近更新 更多