This is my struct.
typedef struct {
uint8_t *data;
size_t size;
} buffer;
I initialize it like this in my main function.
buffer *array;
array = calloc(255, sizeof(*array));
//check for error
for (int i = 0; i < 255; i++) {
array[i].data = malloc(sizeof(*array->data));
//check for error
}
Then I pass it to a function.
ArrayFunction(&array);
This is how it's defined
void ArrayFunction(buffer **array) {
// Doing something to determine somesize
for (int i = 0; i < 255; i++) {
array[i]->size = 100;
array[i]->data = calloc(100, sizeof(uint8_t));
//check for error
//Setting the data to something useful
}
}
When looking at my program through a debugger, my initialization in the main function seems fine, memory is valid. Once it enters the ArrayFunction, memory past the 0th element is invalid or uninitialized which causes a segmentation fault at the point of trying to calloc. It does work for the 0th and so does the setting data step.
You're trying too hard. You don't need double pointers.
Explanations in the comments starting with //**
You probably just want this:
#include <stdint.h>
#include <stdlib.h>
typedef struct {
uint8_t* data;
size_t size;
} buffer;
void ArrayFunction(buffer *arr) { //** just pass the buffer (t's a pointer)
const int somesize = 11; //** just made up some value
for (int i = 0; i < 255; i++) {
arr[i].size = somesize;
arr[i].data = calloc(somesize, sizeof(uint8_t));
}
}
int main(int argc, char* argv[])
{
buffer* array;
array = calloc(255, sizeof(*array));
//check for error
for (int i = 0; i < 255; i++) {
array[i].data = malloc(sizeof(*array->data));
//check for error
}
ArrayFunction(array); //** just pass the pointer
}