对c

时间:2018-01-14 22:40:14

标签: c arrays function pointers parameters

我对两个函数使用相同的指针,

#include <stdio.h>

/* function to generate and return random numbers */
int * getRandom( ) {

    static int  r[10];
    int i;
    for ( i = 0; i < 10; ++i) {
        r[i]=i*2*i*9183784;
        printf( "r1[%d] = %d\n", i, r[i]);
    }
    return r;
}

int * geti( *p) {
    static int  r[10];
    int I;

        r[i] = p[i]*i;
    printf( "r2[%d] = %d\n", i, r[i]);
    }

    return r;
}

int main () {
    int *p;
    int i;

    p = getRandom();
    for ( i = 0; i < 10; i++ ) {
        printf( "*(p + %d) 1: %d\n", i, *(p + i));
    }

    p = geti(p);

    for ( i = 0; i < 10; i++ ) {
        printf( "*(p + %d) 2: %d\n", i, *(p + i));
    }

    return 0;
}

它成为以下输出:

  

r1 [0] = 0
  r1 [1] = 18367568
  r1 [2] = 73470272
  r1 [3] = 165308112
  r1 [4] = 293881088
  r1 [5] = 459189200
  r1 [6] = 661232448
  r1 [7] = 900010832
  r1 [8] = 1175524352
  r1 [9] = 1487773008
  *(p + 0)1:0
  *(p + 1)1:18367568
  *(p + 2)1:73470272
  *(p + 3)1:165308112
  *(p + 4)1:293881088
  *(p + 5)1:459189200
  *(p + 6)1:661232448
  *(p + 7)1:900010832
  *(p + 8)1:1175524352
  *(p + 9)1:1487773008
  r2 [0] = 0
  r2 [1] = 18367568
  r2 [2] = 146940544
  r2 [3] = 495924336
  r2 [4] = 1175524352
  r2 [5] = -1999021296
  r2 [6] = -327572608
  r2 [7] = 2005108528
  r2 [8] = 814260224
  r2 [9] = 505055184
  *(p + 0)2:0
  *(p + 1)2:18367568
  *(p + 2)2:146940544
  *(p + 3)2:495924336
  *(p + 4)2:1175524352
  *(p + 5)2:-1999021296
  *(p + 6)2:-327572608
  *(p + 7)2:2005108528
  *(p + 8)2:814260224
  *(p + 9)2:505055184

这些不能是数学上的数字,例如*(p + 5)2。问题出在哪里? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您正在经历整数溢出。您尝试计算的值不适合32位有符号整数。例如,r2 [5]意味着为459189200 * 5,即2295946000.但是,在带符号的32位整数中可以表示的最大正值是2 ** 31 - 1,即2147483647.所以它来了输出为2295946000 - 2 ** 32,即-1999021296。

您可以在32位无符号整数中表示所需的值,但这样只能获得一个值。

如果您的编译器支持64位long long数据类型,那么这将解决您的问题。除此之外,您可以使用浮点(但最终会丢失低位的精度),或者切换到扩展精度的整数表示。

答案 1 :(得分:0)

主要问题是整数溢出。计算结果不符合int值。 64位long long将允许正确的计算。

这是带有测试结果的修改程序(64位Mac上的gcc 7.2.0):

#include <stdio.h>

/* function to generate and return random numbers */
long long * getRandom(long long r[])
{
    //static int r[10];
    int i;

    for ( i = 0; i < 10; ++i) {
        r[i]=i*2*i*9183784;
        printf( "r1[%d] = %lld\n", i, r[i]);
    }
    return r;
}

long long * geti(long long *p) { // declare the type
    //static int  r[10];
    int i; // i

    for ( i = 0; i < 10; ++i) {
       p[i] = p[i]*i;
       printf( "r2[%d] = %lld\n", i, p[i]);
    }

    return p;
}

int main () {
    long long *p;
    int i;
    long long  r[10];

    p = getRandom(r);
    for ( i = 0; i < 10; i++ ) {
        printf( "*(p + %d) 1: %lld\n", i, *(p + i));
    }

    p = geti(p);

    for ( i = 0; i < 10; i++ ) {
        printf( "*(p + %d) 2: %lld\n", i, *(p + i));
    }

    return 0;
}

输出:

r1[0] = 0
r1[1] = 18367568
r1[2] = 73470272
r1[3] = 165308112
r1[4] = 293881088
r1[5] = 459189200
r1[6] = 661232448
r1[7] = 900010832
r1[8] = 1175524352
r1[9] = 1487773008
*(p + 0) 1: 0
*(p + 1) 1: 18367568
*(p + 2) 1: 73470272
*(p + 3) 1: 165308112
*(p + 4) 1: 293881088
*(p + 5) 1: 459189200
*(p + 6) 1: 661232448
*(p + 7) 1: 900010832
*(p + 8) 1: 1175524352
*(p + 9) 1: 1487773008
r2[0] = 0
r2[1] = 18367568
r2[2] = 146940544
r2[3] = 495924336
r2[4] = 1175524352
r2[5] = 2295946000
r2[6] = 3967394688
r2[7] = 6300075824
r2[8] = 9404194816
r2[9] = 13389957072
*(p + 0) 2: 0
*(p + 1) 2: 18367568
*(p + 2) 2: 146940544
*(p + 3) 2: 495924336
*(p + 4) 2: 1175524352
*(p + 5) 2: 2295946000
*(p + 6) 2: 3967394688
*(p + 7) 2: 6300075824
*(p + 8) 2: 9404194816
*(p + 9) 2: 13389957072