繁体   English   中英

从结构的一个实例打印结构指针

[英]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 bc数组是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM