Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Reading argv[1] gives Segmentation Fault 11 although argc indicates there's two parameters

I stumbled upon an issue whereby if I want to read input arguments not inside the main method but inside another method into which argv is passed by reference I’m getting Segmentation Fault 11 for reading argument from argv[1] that succeeded in the main method.

I understand why segmentation fault happens – it’s when program tries read outside the memory allocated for it. But here it seems to me I’m doing everything right – reading argv[1] is valid in main method. Also reading argv[0] is valid in the handleInput method but for reading argv[1] inside handleInput method I get Segmentation fault: 11. argc also indicates there’s two parameters but I can only read the first one (the executable filename).

segfault

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#include <stdio.h>

void handleInput(int *argc, char ***argv) {
    printf("%d\n", *argc);
    printf("%s\n", *argv[0]);
    printf("%s\n", *argv[1]);
    printf("\n");
}

int main(int argc, char **argv) {
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    printf("\n");

    handleInput(&argc, &argv);

    return 0;
}

$ ./segfault parameter

2
./segfault
parameter

2
./segfault
Segmentation fault: 11

I’m using clang compiler on MacOS

$ clang -v
Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin22.1.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Why can’t I read argv[1] inside handleInput method? What am I doing wrong?

>Solution :

There’s no need to pass pointers to argc and argv, since you’re not planning on changing them. Passing by value is fine! Just use them as-is. This should work:

#include <stdio.h>

void handleInput(int argc, char *argv[]) {
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    printf("\n");
}

int main(int argc, char *argv[]) {
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    printf("\n");

    handleInput(argc, argv);

    return 0;
}

I replaced the char **argv with char *argv[] to make it more obvious it is an array of strings.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading