Мне нужно создать массив структур. Пока я не запустил программу, я буду знать, сколько структур мне нужно будет хранить в массиве. План состоял в том, чтобы передать указатель на структуру функции, которая будет считывать данные в нее, но я делаю сомнительную ошибку. Вот код, чтобы проиллюстрировать то, что я пытаюсь сделать:Размер c массива структуры во время выполнения
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef struct {
int myVar;
} myStruct;
myStruct *myBigList = NULL;
int defineMyList(myStruct **myArray) {
int i = 0, size = rand() % 10;
*myArray = malloc(size * sizeof *myArray);
for (i = 0; i < size; i++) {
myStruct *aStruct = malloc(sizeof(myStruct));
aStruct->myVar = i + 1;
myArray[i] = aStruct;
}
return size;
}
int main() {
int size = 0, i = 0;
srand(time(NULL));
size = defineMyList(&myBigList);
for (i = 0; i < size; i++)
printf("myBigList[%i].myVar: %i\n", i, myBigList[i].myVar);
return EXIT_SUCCESS;
}
Я приспособил этот код из another question, что была проблема, похожий на мой.
Моя проблема заключается в том, что, когда я пытаюсь напечатать массив в основном после того как я положил в него данные я просто получаю это:
myBigList[0].myVar: 1
myBigList[1].myVar: 0
myBigList[2].myVar: 0
myBigList[3].myVar: 0
myBigList[4].myVar: 0
Когда я ожидал этого:
myBigList[0].myVar: 1
myBigList[1].myVar: 2
myBigList[2].myVar: 3
myBigList[3].myVar: 4
myBigList[4].myVar: 5
I Подозреваю, что я неправильно понял что-то с индексацией и указателями. Когда я запускаю программу с valgrind, она сообщает "Invalid read of size 4 at 0x40074D: main"
и "Address 0x51fc0d4 is 0 bytes after a block of size 4 alloc'd at 0x4C2AB80: malloc"
.
@chqrlie Почему вы изменили отступы? Это было прекрасно. – fuz
'sizeof * myArray' - размер указателя, а не структуры – Soren
Кроме того,' myArray [i] 'должен быть' (* myArray) [i] ', и это' struct myStruct' не указатель, и я оставлю это вам, чтобы понять, почему это так. – immibis