我对两个函数使用相同的指针,
#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。问题出在哪里? 提前谢谢。
答案 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