【问题标题】:Printing struct pointers from one instance of the struct从结构的一个实例打印结构指针
【发布时间】: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

【问题讨论】:

  • abc 在调用 generate_arrays 后超出范围,并且通过地址使用它们是未定义的行为。
  • srand(time(NULL)); 在错误的位置 - 它应该是 before array=generate_arrays(len); @iharob 更新的答案。
  • @WeatherVane 很好,直到你说了什么我才注意到。谢谢。
  • 在调试时,使用srand(0) 会很有帮助,因此序列(和错误!)是可重复的。

标签: c struct


【解决方案1】:

您将局部变量的地址存储在结构成员中。

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;
}

【讨论】:

    【解决方案2】:

    声明

    int a[len],b[len],c[len];
    

    正在声明/分配函数本地的变量。

    您应该执行以下操作:

    int *a = malloc(len * sizeof(int)), 
        *b = malloc(len * sizeof(int)), 
        *c = malloc(len * sizeof(int));
    

    【讨论】:

    • 问题是 C,而不是 C++。
    • 是的,只是在 C 中,所以我不能使用它。
    • 这并不意味着它没有帮助,也不值得一票否决....我更新了答案,以便用malloc替换new,这是唯一的区别!
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多