/ / Tlač štrukturových ukazovateľov z jednej inštancie

Tlač štrukturálnych ukazovateľov z jednej inštancie štruktúry, štruktúry

#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 %dn",*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("nn");
for(i=0;i<len;i++)
{

printf("%d %d %dn",*array.first++,*array.second++,*array.third++);
}
return array;
}

Vo vyššie uvedenom kóde sa snažím vytlačiťstruct hodnoty iba jednej inštancie struct Arrays, namiesto použitia ukazovateľa. Aby som to urobil, používam polia na ukladanie náhodných čísel a potom priraďujem pole ukazovateľovi vo vnútri struct. Tlačiareň vo vnútri funkcie tlačí síce normálne (horná množina čísel), ale keď tlačiareň mainfun beží, tlačí odpadky (spodná množina čísel). Vzorový výstup je nižšie. Takže moja otázka znie, prečo by to robilo, pretože printfs sú rovnaké?

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

odpovede:

1 pre odpoveď č. 1

Do štruktúrnych členov ukladáte adresy miestnych premenných.

Na a b a c Polia sú miestne pre internet generate_arrays() a keď táto funkcia vracia, sú polia uvoľnené.

Musíte sa ubezpečiť, že tieto údaje zostanú platné aj po návrate funkcie, a preto odporúčam nasledujúce

#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 %dn", 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 pre odpoveď č. 2

Vyhlásenie

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

deklaruje / alokuje premenné, ktoré sú lokálne pre funkciu.

Mali by ste vykonať niečo také:

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