Home > front end >  Correct way to dynamically allocate a const char array in C
Correct way to dynamically allocate a const char array in C

Time:11-01

I have to read from a file line by line and add those lines into a char array. I need to keep the array const and also pass it as a const pointer.

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

void takeAction(const char **charArray) {

    for (int i = 0; i<2; i  ) {
        printf("%s\n", charArray[i]);
    }

}

int main(int ac, char **av)
{
    
    // Read patterns from file

    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    int counter = 0;

    const char *charArray[1000];

    fp = fopen(av[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "%s File could not be opened \n", av[2]);
        return 1;
    }
    while ((read = getline(&line, &len, fp)) != -1)
    {
        
        charArray[counter] = malloc(sizeof(char)*(read 1));
        memcpy(charArray[counter], line, read);
        counter  ;

        if (counter == 2) {
          counter = 0;
          takeAction(charArray);
        }

    }
    fclose(fp);
    return 0;
}

compilation error

 temp.c: In function ‘main’: temp.c:42:16: warning: passing argument 1
 of ‘memcpy’ discards ‘const’ qualifier from pointer target type
 [-Wdiscarded-qualifiers]
          memcpy(charArray[counter], line, read);
                 ^~~~~~~~~ In file included from temp.c:3:0: /usr/include/string.h:42:14: note: expected ‘void * restrict’ but
 argument is of type ‘const char *’  extern void *memcpy (void
 *__restrict __dest, const void *__restrict __src,

Execution ./temp MyFileWithMultipleLines

When I keep charArray as const, I get warning while memcpy -> ‘memcpy’ discards ‘const’ qualifier

When I remove the const from charArray, I get an error while calling the function takeAction.

CodePudding user response:

You can't have charArray as const as you are writing to it.

Try something like that:

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

void takeAction(const char **charArray) {

    for (int i = 0; i<2; i  ) {
        printf("%s\n", charArray[i]);
    }

}

int main(int ac, char **av)
{

    // Read patterns from file

    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    int counter = 0;

    char *charArray[1000];

    fp = fopen(av[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "%s File could not be opened \n", av[2]);
        return 1;
    }
    while ((read = getline(&line, &len, fp)) != -1)
    {

        charArray[counter] = malloc(sizeof(char)*(read 1));
        memcpy(charArray[counter], line, read);
        counter  ;

        if (counter == 2) {
          counter = 0;
          takeAction((const char **)&charArray[0]);
        }

    }
    fclose(fp);
    return 0;
}
  • Related