【发布时间】:2015-05-08 10:39:05
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct{
int* first;
int* second;
int* third;
}Arrays;
Arrays generate_arrays(int len);
int main(void)
{
int i;
int len=10;
Arrays array;
array=generate_arrays(len);
srand(time(NULL));
for(i=0;i<len;i++)
{
printf("%d %d %d\n",*array.first++,*array.second++,*array.third++);
}
return 0;
}
Arrays generate_arrays(int len)
{
int i;
Arrays array;
int a[len],b[len],c[len];
for(i=0;i<len;i++)
{
a[i]=((rand()%len)+1);
b[i]=((rand()%len)+1);
c[i]=((rand()%len)+1);
}
array.first=a;
array.second=b;
array.third=c;
printf("\n\n");
for(i=0;i<len;i++)
{
printf("%d %d %d\n",*array.first++,*array.second++,*array.third++);
}
return array;
}
在上面的代码中,我试图打印出结构数组的一个实例的结构值,而不是使用指针。为此,我使用数组来存储随机数,然后将数组分配给结构内的指针。函数内部的 printf 通常打印出整数(顶部数字集),但是当 main 中的 printf 运行时,它会打印出垃圾(底部数字集)。示例输出如下。所以我的问题是为什么它会这样做,因为 printfs 是完全相同的?
8 10 4
9 1 3
5 9 4
10 1 6
3 3 8
4 8 10
1 3 4
10 10 8
1 4 10
9 7 6
-65536 0 0
8064 0 0
-64641 0 1606415984
-65536 0 32767
-1 0 2058584832
0 0 32767
0 -64641 1606416144
0 -65536 32767
-65536 -1 -1857669479
8064 0 32767
【问题讨论】:
-
a、b和c在调用generate_arrays后超出范围,并且通过地址使用它们是未定义的行为。 -
srand(time(NULL));在错误的位置 - 它应该是 beforearray=generate_arrays(len);@iharob 更新的答案。 -
@WeatherVane 很好,直到你说了什么我才注意到。谢谢。
-
在调试时,使用
srand(0)会很有帮助,因此序列(和错误!)是可重复的。