Search code examples
carraysdynamicstructdynamic-arrays

Accessing and inputting elements into a dynamic array of structs in C


I am trying to access different elements in my dynamic struct array however I can't seem to access any other element in the array besides the first.

C file

#include <stdio.h>
#include <stdlib.h>
#include "tuples.h"

void createTuple();

int main() {
    createTuple();
    return 0;
}

void createTuple(){

    int numOfTup;

    printf("How many tuples would you like to create:\n");
    scanf(" %d", &numOfTup);

    tuple_t *tuples;

    tuples = malloc(numOfTup * sizeof(char) * sizeof(int) * 3);

    if (tuples == NULL){
        printf("Memory allocation failed");
        exit(EXIT_FAILURE);
    }

    for (int j = 0; j < numOfTup; ++j) {

        printf("Enter an identifier for the Tuple: \n");
        scanf(" %c", &tuples[j].identifier);

        printf("TUPLE: %c\n",tuples[j].identifier);

        for (int i = 0; i < 4; ++i) {
            printf("Enter the value for the tuple (C:I:I:I)\n");
            if (i == 0) {
                scanf(" %c", &tuples[j].val0);
            } else if (i == 1) {
                scanf(" %d", &tuples[j].val1);
            } else if (i == 2) {
                scanf(" %d", &tuples[j].val2);
            } else if (i == 3) {
                scanf(" %d", &tuples[j].val3);
            }
        }
    }

}

Header file for the struct

#ifndef TASK2_TUPLES_H
#define TASK2_TUPLES_H

struct tuple{
    char identifier[100];

    char val0;
    int val1;
    int val2;
    int val3;
};

typedef struct tuple tuple_t;


#endif //TASK2_TUPLES_H

I can't seem to access the struct at tuples[j] because whenever I try to run it it only saves the first set of elements.

Also whenever inputting the identifier the compiler skips the loop and does not allow me to enter any elements into the struct.

Thanks.


Solution

  • There are several issues with your code:

    1. You allocate nowhere near enough memory. If your tuple identifier is 100 chars, you should allocate at least 101 * sizeof(char) + 3*sizeof(int) bytes of memory. In practice, this might not suffice because the compiler might pad the struct to better align with memory. Thus, the real size might be greater. The safe thing to do is to allocate sizeof(tuple_t) bytes
    2. Your scanf function to read the identifier reads a char, not a string. use %s to read string. Also, scanf expects pointers to already allocated objects of the type specified by their corresponding format specifier, in our case, %s is a string, so the type should be char *. Thus, the parameter should be tuples[j].identifier, rather than &tuples[j].identifier

    Overall:

    #include <stdio.h>
    #include <stdlib.h>
    #include "tuples.h"
    
    void createTuple();
    
    int main() {
        createTuple();
        return 0;
    }
    
    void createTuple(){
    
        int numOfTup;
    
        printf("How many tuples would you like to create:\n");
        scanf(" %d", &numOfTup);
    
        tuple_t *tuples;
    
        tuples = malloc(numOfTup * sizeof(tuple_t));
    
        if (tuples == NULL){
            printf("Memory allocation failed");
            exit(EXIT_FAILURE);
        }
    
        for (int j = 0; j < numOfTup; ++j) {
    
            printf("Enter an identifier for the Tuple: \n");
            scanf("%s", tuples[j].identifier);
    
            printf("TUPLE: %s\n",tuples[j].identifier);
    
            for (int i = 0; i < 4; ++i) {
                printf("Enter the value for the tuple (C:I:I:I)\n");
                if (i == 0) {
                    scanf(" %c", &tuples[j].val0);
                } else if (i == 1) {
                    scanf(" %d", &tuples[j].val1);
                } else if (i == 2) {
                    scanf(" %d", &tuples[j].val2);
                } else if (i == 3) {
                    scanf(" %d", &tuples[j].val3);
                }
            }
        }
    
    }