#c #multidimensional-array #struct #malloc #field
Вопрос:
Я создал эту структуру и функцию, которая инициализирует все поля в этой структуре и возвращает указатель на структуру. В этой структуре у меня есть один одномерный массив целых чисел и двумерный массив указателей. Однако при инициализации и увеличении значения внутри ячеек внутри party->fragment_sizes[I] (одномерный массив), party->>fragment_sizes[] также начинает увеличиваться (двумерный массив). Участник->размер фрагмента[i] изменяется с НУЛЯ (0x0) до (0x10000), (0x2000000) Я понятия не имею, как, но это меня очень сильно расстраивает. Мне нужно, чтобы party_fragments_sizes оставался НУЛЕВЫМ до тех пор, пока не будет выделен (внутри другой функции).
#include <stdio.h>
#include <stdlib.h>
typedef struct LonelyPartyArray
{
int **fragments; // the address of fragments[i] is being set as
int *fragment_sizes; // the value inside fragment_sizes[i]
} LonelyPartyArray;
LonelyPartyArray *createParty(int num_fragments)
{
int i;
// Allocating LonelyPartyArray struct pointer
LonelyPartyArray *party = malloc(sizeof(LonelyPartyArray));
// I am allocating these separately,
// is something going on with how my system is
// allocating space for these arrays?
// Allocating LonelyPartyArray
party->fragments = malloc(sizeof(int *) * num_fragments);
// Allocating LonelyPartyArray fragment size
party->fragment_sizes = malloc(sizeof(int) * num_fragments);
// Initializing party->fragments to NULL (not used) and fragment_sizes to zero
for (i = 0; i < num_fragments; i )
party->fragments[i] = NULL;
for (i = 0; i < num_fragments; i )
party->fragment_sizes[i] = 0;
// Party->fragments[I] is not remaining NULL, but is being
// incremented. (I.e., party-fragments[I] increments 0x0,
// 0x10000, 0x20000, 0x30000 etc). This needs to remain NULL.
for (i = 0; i < num_fragments; i )
{
if (party->fragments[i] != party->fragment_sizes[i])
break;
printf("Why is this happening???? [%d]n", i);
printf("%pn, party->fragments[i]);
}
return NULL;
}
int main(void)
{
LonelyPartyArray *party = createParty(3);
return 0;
}
Я понятия не имею, как party->fragments[] устанавливается в качестве адреса для party->>fragment_sizes [], но мне нужно, чтобы они были отдельными.
Комментарии:
1. Что заставляет вас думать
party->fragments[i]
, что это устанавливается в качестве адресаparty->fragment_sizes[i]
? Вы получаете не адресparty->fragment_sizes[i]
, а его стоимость.2. Воспользуйся
if (party->fragments[i] != amp;party->fragment_sizes[i])
3. При увеличении party->fragments[] увеличивается адрес party->>fragment_sizes []. Адрес party->fragment_sizes[] изменяется от NULL (0x0) до 0x100000, 0x200000, 0x300000 и т.д. Party->fragment_sizes[] должен оставаться нулевым @Barmar
4.
fragment_sizes
содержит целые числа, а не указатели, почему вы сравниваете их с указателями?5. Потому что указатель (сторона->фрагменты[I]) изменяется с НУЛЯ на значение целого числа. Я хотел сказать, что party->фрагменты[I] адресуют приращения в моем последнем комментарии. Извините