Pure c . Array of structures. Dynamically allocated within a function. How to allocate memory correct? : The code below had made from examples of this site. I can't understand what am I doing wrong? Could you please point me.

Compiling with:

gcc -std=c11 main.c

Prints only:

> Thing: Boiled buckwheat, weight: 1500

> Segmentation fault

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    
    typedef struct {
    	// Weight in grams
    	size_t weight;
    	// Name of Thing
    	char name[255];
    
    } Things;
    
    void add_new_thing(Things **things,size_t *size)
    {
    
    	size_t index = *size;
    
    	if(index == 0){
    		(*size) = 1;
    		*things = (Things*)calloc((*size),sizeof(Things));
    		if (*things == NULL) {
    			fprintf(stderr, "Error: can't allocate memory! %s\n", strerror(errno));
    			exit(EXIT_FAILURE);
    		}
    	}else{
    		(*size) += 1;
    		Things *temp = (Things*)realloc(*things,(*size)*sizeof(Things));
    		if(temp != NULL) {
    			*things = temp;
    		}else{
    			fprintf(stderr, "Error: can't reallocate memory! %s\n", strerror(errno));
    			exit(EXIT_FAILURE);
    		}
    		// Zeroing of new structure's elements
    		things[index]->name[0] = '\0';
    		things[index]->weight = 0;
    	}
    
    }
    
    void another_function(Things *things,size_t *size)
    {
    	// Add one element to array of structures
    	add_new_thing(&things,size);
    	const char *str1 = "Boiled buckwheat";
    	strncpy(things[*size-1].name, str1, strlen(str1) + 1);
    	things[*size-1].weight = 1500;
    
    	for(size_t i = 0;i < *size;i++){
    		printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    	}
    	// One element of array of structures was printed there
    
    	// Add new one element to array of structures
    	add_new_thing(&things,size);
    	const char *str2 = "A toy";
    	strncpy(things[*size-1].name, str2, strlen(str2) + 1);
    	things[*size-1].weight = 350;
    
    	// Segmentation fault is there
    	for(size_t i = 0;i < *size;i++){
    		printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    	}
    }
    
    void some_function(Things *things,size_t *size)
    {
    	// Pass array of structures to another function
    	another_function(things,size);
    }
    
    int main(void)
    {
    
    	// Create NULL pointer for array of structures
    	Things *things = NULL;
    
    	// And size of structures array which will be allocated within add_new_thing() function
    	size_t size = 0;
    
    	// Call some function
    	some_function(things,&size);
    
    	// Segmentation fault is there
    	printf("Print results:\n");
    	for(size_t i = 0;i < size;i++){
    		printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    	}
    
    	free(things);
    
    	return(EXIT_SUCCESS);
    }



