#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;
}
在上面的代码中,我试图打印出struct Arrays的一个实例的struct值,而不是使用指针。为此,我使用数组来存储随机数,然后将数组分配给结构内的指针。函数内部的printf打印出正常的int(顶部数字集),但是当mainf中的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
答案 0 :(得分:1)
您正在结构成员中存储局部变量的地址。
a
b
和c
数组是generate_arrays()
函数的本地数组,当该函数返回时,数组将被释放。
您需要确保在函数返回后它们的数据仍然有效,因此我建议使用以下内容
#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 index;
int length;
Arrays array;
srand(time(NULL));
length = 10;
array = generate_arrays(length);
for (index = 0 ; index < length ; index++)
printf("%d %d %d\n", array.first[index], array.second[index], array.third[index]);
free(array.first);
free(array.second);
free(array.third);
return 0;
}
Arrays generate_arrays(int length)
{
int index;
Arrays array;
array.first = malloc(length * (sizeof(*array.first)));
array.second = malloc(length * (sizeof(*array.first)));
array.third = malloc(length * (sizeof(*array.first)));
if ((array.first == NULL) || (array.second == NULL) || (array.third == NULL))
{
free(array.first);
free(array.second);
free(array.third);
array.first = NULL;
array.second = NULL;
array.third = NULL;
return array;
}
for (index = 0 ; index < length ; index++)
{
array.first[index] = ((rand() % length) + 1);
array.second[index] = ((rand() % length) + 1);
array.third[index] = ((rand() % length) + 1);
}
return array;
}
答案 1 :(得分:0)
声明
int a[len],b[len],c[len];
声明/分配函数本地的变量。
您应该执行以下操作:
int *a = malloc(len * sizeof(int)),
*b = malloc(len * sizeof(int)),
*c = malloc(len * sizeof(int));