提供数字范围(C)的功能出现问题。为什么?

时间:2020-04-10 20:14:51

标签: c algorithm

我创建了一个函数,该函数根据一个数字提供一定范围的数字,并且您想要获取的数字数量与该数字不同(我知道,这种解释有点含糊,所以这里有一个示例):

Number of origin: 10
Number of numbers to count away from the origin: 5
Output:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

下面是代码:

#include <stdio.h>
#include <stdlib.h>

void plusMinus(int*change, int num, int funcTo){

    int range = funcTo * 2;
    int start = num - funcTo;
    int i;
    for (i=0; i<=range; i++){
        change[i] = start + i;
    }
}

int main()
{
    int* pointer;
    plusMinus(&pointer, 250, 5);
    int x;
    for (x=0; x<=10; x++){
        printf("%d\n", &pointer[x]);
    }
    return 0;
}

这是所需的输出:

245
246
247
248
249
250
251
252
253
254
255

这是当前输出:

245
249
253
257
261
265
269
273
277
281
285

代码也返回两个警告,但是我不知道它们是什么意思。这是第一个:

warning: passing argument 1 of 'plusMinus' from incompatible pointer type [-Wincompatible-pointer-types]

这是第二个:

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]

1 个答案:

答案 0 :(得分:0)

第一个函数参数的类型为int *

void plusMinus(int*change, int num, int funcTo){

但是您传递的是int **类型的参数

int* pointer;
plusMinus(&pointer, 250, 5);

此外,指针pointer未初始化,并且具有不确定的值。结果,该程序具有未定义的行为。

printf的通话中

printf("%d\n", &pointer[x]);

在传递类型%d的对象时,转换说明符int期望类型为int *的对象。

这是您更新的程序

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    int range = 2 * funcTo + 1;
    int start = num - funcTo;

    for ( int i = 0; i <range; i++ )
    {
        a[i] = start + i;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

其输出为

245 246 247 248 249 250 251 252 253 254 255 

将函数编写为递归函数更有趣。

您在这里。

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    a[0] = num - funcTo;

    if ( funcTo ) 
    {
        plusMinus( a + 1, num, funcTo - 1 );

        a[2 * funcTo] = num + funcTo;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

程序输出与上面显示的相同。

245 246 247 248 249 250 251 252 253 254 255