If you don't know how big they will be, then use dynamic allocation. Key functions here are malloc and free.
Here's a suggestion on how you can use your structs if you don't know how big they will be:
First have the following includes in your code:
#include <stdio.h> /* for printf */
#include <string.h> /* for strcpy, as you cannot directly assign strings to a malloc'd pointer */
#include <stdlib.h> /* for malloc and free, for managing memory dynamically */
Then we define the size of the keys and values:
const int key_size = 10; /* let's define how big our keys and values will be */
const int value_size = 25;
And here is how you can use your structs:
map.size = 30; /* decide how many keyValues we will have */
map.keyValue = malloc(sizeof(_keyValue) * map.size); /* create storage big enough for 30 _keyValue structs
* malloc will allow you to assign memory to key and treat it as an array
* malloc assigns memory from the heap
* equal to the size specified (30),
* this can be potentially as large as your computer's memory */
map.keyValue[0].key = malloc(sizeof(char) * key_size); /* let's create a key at position 0 */
strcpy(map.keyValue.key, "some key"); /* copying some values into key */
map.keyValue[0].value = malloc(sizeof(char) * value_size); /* let's create some space for a value for the 0th element */
strcpy(map.keyValue.value, "some value");
... /* you process and work with those values as you see fit */
free(map.keyValue[0]) /* malloc assigned memory needs to be returned to the OS as it's manually managed,
* here we free the element at position 0 we created earlier
* if you have more than element here use a loop e.g:
* for (int i = 0; i < map.size; i++) { free(map.KeyValue[i]) }
*/
free(map.keyValue); /* free the keyValue itself that stored all the keyValue structs*/
One tip, declarations starting with an underscore are discouraged as they are reserved for the language.