Search code examples
carraysstaticstructureflexible-array-member

C Programming - Non static initialization of a flexible array member


I think my english is just to bad to understand the other articles about this. But anyway:

I just thought i could write a program (in C), that can store a set of cards. Not complicated, just store values and names of cards and print them out. I'm a beginner in C, and because i'm in the section "Strings in Structures" in my Book, i wanted to try out structures on my own. This is my Code so far:

#include <stdio.h>

struct card
{
    int value;
    char name[];
};

int main(void)
{
    const struct card heart[13] = { {2,"two"}, {3,"three"}, {4,"four"}, {5,"five"}, {6,"six"}, {7,"seven"}, {8,"eight"}, {9,"nine"}, {10,"ten"}, {11,"jack"}, {12,"queen"}, {13,"king"}, {14,"ace"} };
    int i;

    for (i = 0; i < 13; ++i)
    {
        printf("The card heart-%s has the value of %i", heart[i].name, heart[i].value);
    }

return 0;

}

I just wanted to test if it works, so i just wrote the heart-cards in the code. If i want to compile this file, my compiler (gcc/mingw) hits me with 26 errors. It says: "(near initialization of heart[0])" "non static initialization of a flexible array member" I don't really understand this. In the book, everything works as expected. I tried to rebuild the code in the book and changing the names, but it doesn't work. I think it's a problem with the strings, because if i use integers only, everything works. In already read in another post, that every string should be allocated manually, and there was a code example, but i don't know what all the lines should mean, and i want understand what my code does, so i don't copy + paste.

Could you explain me why this doesn't work? PS: I am writing currently in windows, so please don't use bash commands to explain or something like that. I am also german and my english is not the "yellow of the egg", try to explain without using complex 'sentence builds' (i hope you know what i mean :D) and unusual words.

Thanks for all help!


Solution

  • You need to create some space for the name of each card. Easiest way to do this would be to change your struct card definition to something like:

    struct card
    {
      int value;
      char name[16];  // doesn't have to be 16, but make sure it's large enough to hold each card name plus a '\0' terminator
    };