12

I am trying to learn C, and I wonder why this doesn't work?

#include <stdio.h>

int main(int argc, char *argv[])
{
    char testvar[] = argv[0];
    //do something with testvar

    return 0;
}

3 Answers 3

13

You could do this instead:

char *testvar = argv[0];

Or maybe:

char *testvar = strdup(argv[0]);
/* Remember to free later. */

As pmg notes, strdup isn't standard. Implementing it using malloc + memcpy is a nice exercise.

Or even:

char testvar[LENGTH];
if (strlen(argv[0]) >= LENGTH)
    fprintf(stderr, "%s is too long!\n");
else
    strcpy(testvar, argv[0]);

But then again you might be looking for:

char testvar[] = "testvar";
Sign up to request clarification or add additional context in comments.

Comments

4

That syntax is valid only to initialize a char array from a literal, i.e. when you explicitly write in the source code what characters must be put in the array.

If you just want a pointer to it (i.e. "another name" to refer to it) you can do:

char * testvar = argv[0];

if instead you want a copy of it you have to do:

size_t len = strlen(argv[0]);
char * testvar = malloc(len+1);
if(testvar==NULL)
{
    /* allocation failed */
}
strcpy(testvar, argv[0]);
/* ... */
free(testvar);

Comments

2

You need a constant to initialize an object. argv[0] is not a constant.
"foobar" below is a constant

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

int main(int argc char **argv) {
    char array[] = "foobar"; /* array has 7 elements */
    char *testvar;

    testvar = malloc(strlen(argv[0]) + 1); /* remember space for the NUL terminator */
    if (testvar != NULL) {
        strcpy(testvar, argv[0]);
        /* do something with testvar */
        free(testvar);
    } else {
        /* report allocation error */
    }
    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.