why malloc yields error after long argv arguments?

Viewed 63

I have written a program where it reads some filenames and a word from command line arguments. The first argument will be a word and remaining will be filenames. It fills a structure that I have defined. However for small arguments, the program works correctly but for large ones malloc gives corrupted top size error.

Below is just initial code of the program:

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

#define FILENAME_LIM 256
#define WORD_LIM 256

struct data {
    char filename[FILENAME_LIM];
    char word[WORD_LIM];
};

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("usage: ./a.out word filename1 filename2 filename3 filename4 filename5 ...\n");
        exit(EXIT_FAILURE);
    }   
    char word[WORD_LIM];
    strcpy(word, argv[1]);
    int files = argc - 2;
    struct data *dataarray = (struct data *)malloc(sizeof(sizeof(struct data) * files));
    if (!(dataarray)) {
        perror("malloc");
        exit(EXIT_FAILURE);                                                                                                                                                                                        
    }   
    for (int i = 0; i < files; i++) {
        strcpy(dataarray[i].filename, argv[i + 2]);
        for (int ii = 0; ii < strlen(dataarray[i].filename) + 1; ii++) {
            printf("filename[%d] = %c (%d), argv[%d] = %d\n",
                   i, dataarray[i].filename[ii], dataarray[i].filename[ii],
                   i, argv[i + 2][ii]);
        }
    }   
    return 0;
}

I tried everything, but when I give some large filename in argv such as "../../../C Programs/chess.c", malloc yields an error. I want to know what is making corrupted top size.

1 Answers
sizeof(struct data) * files

is a valid size. Any multiple of a size is a size.

sizeof(sizeof(struct data) * files)

is like saying sizeof(23422). I don't know what that means, and odds are the runtime isn't behaving properly either.

Restrict your use of sizeof(...) to processing type arguments.

Related