Search code examples
arrayscstringpointersc-strings

Initialise array of character pointers inside a function to be used in main


How can I initialise array of character pointers inside a function. It should be noted that length comes dynamically from other calculations inside the function. I cannot find length inside main(). For simplicity I have taken rand() to explain scenario.

Is there any way where I can initialise array of character pointers with certain length without passing length from main() to setArgs() ?

With below code I get errors:

temp.c:8:6: error: invalid use of array with unspecified bounds 8 | args[length];

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

void setArgs(char* (*args)[])
{
    int length = (rand() % 5) + 2;

    args[length];
    args[0]="hello\0";
    args[1]="jack\0";
}
int main()
{
    char* myArgs[]={NULL};
        
    setArgs(&myArgs);

    for(int i=0;i<2;i++)
    {
        printf("%s", myArgs[i]);
    }

    return 0;
}

Solution

  • You have two options. Allocate the memory dynamically or first generate the length:

    1.

    #include<stdio.h>
    #include<stdlib.h>
    
    void setArgs(char *** args)
    {
        int length = (rand() % 5) + 2;
        *args = malloc(sizeof(char *)*length);
    
        (*args)[0]="hello\0";
        (*args)[1]="jack\0";
    }
    int main()
    {
        char ** myArgs = NULL;       
        setArgs(&myArgs);
    
        for(int i=0;i<2;i++)
        {
            printf("%s", myArgs[i]);
        }
        free(myArgs);
        return 0;
    }
    

    or 2.

    
    #include<stdio.h>
    #include<stdlib.h>
    
    void setArgs(char ** args)
    {
        args[0]="hello\0";
        args[1]="jack\0";
    }
    int main()
    {
        int length = (rand() % 5) + 2;
        char* myArgs[length];
            
        setArgs(myArgs);
    
        for(int i=0;i<2;i++)
        {
            printf("%s", myArgs[i]);
        }
        return 0;
    }
    

    args[length]; doesnt change the length but just does an array-access at the index length