[英]Printing struct pointers from one instance of the struct
#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
您正在将局部变量的地址存储在struct成员中。
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;
}
报关单
int a[len],b[len],c[len];
声明/分配函数局部变量。
您应该执行以下操作:
int *a = malloc(len * sizeof(int)),
*b = malloc(len * sizeof(int)),
*c = malloc(len * sizeof(int));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.