/* argv.c Jeff Ondich, 16 February 2022 Updated 9 November 2023 because Feb 2022 Jeff was a dope. What the heck is going on with arg and argv? Could I build my own argv? */ #include #include #include void print_args(char *argv[]); int main(int argc, char *argv[]) { // argv is an array of character pointers. Here are their values. print_args(argv); // Can you build your own argv and pass it to a function? Yes! // Method 1: malloc your pointers, stick the pointers in argv int my_argc = 4; char *my_argv[my_argc + 1]; for (int k = 0; k < my_argc; k++) { my_argv[k] = malloc(10); if (my_argv[k] != NULL) { strcpy(my_argv[k], "moose"); } else { fprintf(stderr, "Bad malloc, so sad. I'm outta here.\n"); exit(1); } } my_argv[my_argc] = NULL; print_args(my_argv); for (int k = 0; k < my_argc; k++) { free(my_argv[k]); } // Method 2: Initialize one char buffer with nulls inside it, and // point argv[k] to successive substrings char *arguments = "emu\0goat\0newt\0"; my_argc = 3; my_argv[0] = &arguments[0]; my_argv[1] = &arguments[4]; my_argv[2] = &arguments[9]; my_argv[3] = NULL; print_args(my_argv); // Want something wackier that could be helpful? Search for "strtok example" return 0; } void print_args(char *argv[]) { printf("==== argv ====\n"); int k = 0; for ( ; argv[k] != NULL; k++) { printf("argv[%d]: %p, %s\n", k, argv[k], argv[k]); } printf("argv[%d]: %p, %s\n", k, argv[k], "NULL"); printf("\n"); }