Estoy estudiando linux, C++ programación cuando veo

int execve(const char *path,
           char *const argv[],
           char *const envp[]);

No entiendo lo que es char *const argv[] . Sé char *const foo es una constante de puntero a char. Y const char *foo es un puntero a un const char. Pero lo que es char *const argv[]?

Es una matriz de const punteros a char o un array de punteros a const char?

Y tengo un vector<string> ahora, cómo convertir a char *const argv[]?

InformationsquelleAutor Kaoet | 2011-08-11

3 Comentarios

  1. 31

    Es una matriz de const punteros a char o un array de punteros a const char?

    Tipos de lectura de derecha a izquierda:

    const siempre se une a la izquierda (a menos que sea en la izquierda)

    char *const argv[]
    
                    ^^ Array of
          ^^^^^        const
         ^             pointer to
    ^^^^               char

    Una matriz de "const pointer" a char

    Para los punteros en la matriz no puede ser modificado.

    Pero lo que punto puede ser modificado.

    Nota: Como se ha señalado por Steve a continuación. Porque esto está siendo utilizado como un parámetro. Que en realidad se desintegra en un «Un puntero a "const pointer" a char» o «char* const *».

    Y tengo un vector<cadena> ahora, cómo convertir a char *const argv[]?

    int execve(const char *path,
           char *const argv[],
           char *const envp[]);
    
    int main()
    {
        std::vector<std::string>   data;  ///fill
        std::vector<char*>         argv;
        std::vector<char*>         envp;
    
        for(std::vector<std::string>::iterator loop = data.begin(); loop != data.end(); ++loop)
        {
            argv.push_back(&(*loop)[0]);
        }
    
        //I also bet that argv and envp need to be NULL terminated
        argv.push_back(NULL);
        envp.push_back(NULL);
        execve("MyAppName", &argv[0], &envp[0]);
    }
    • +1 para el esquemática explicación 😀
    • Es cierto que char *const argv[] es un tipo de matriz, pero en este contexto, un parámetro de la función, el tipo no es char *const argv[], es char *const *argv.
  2. 2
    //says: argv is a constant pointer pointing to a char*
    int main(int c, char *const argv[]);

    Usted no será capaz de cambiar «argv» dentro de la función.

    Como usted apenas está aprendiendo C, te recomiendo que realmente tratar de entender las diferencias entre las matrices y punteros primer lugar de las cosas comunes.

    En el área de parámetros y matrices, hay un par de confundir las reglas que debe quedar claro antes de ir. En primer lugar, lo que usted declara en una lista de parámetros es tratado especial. Hay situaciones en las que las cosas no tienen sentido, como un parámetro de la función en C. Estos son

    • Funciones como parámetros
    • Arrays como parámetros

    Arrays como parámetros

    El segundo tal vez no es inmediatamente evidente. Pero es evidente cuando se considera que el tamaño de una matriz de dimensión es parte del tipo en C (y una matriz cuyo tamaño de la dimensión no se ha dado un tipo incompleta). Así que, si usted quiere crear una función que toma una matriz por valor de (recibe una copia), entonces sólo podría hacerlo para uno de tamaño! Además, las matrices pueden llegar a ser grande, y C intenta ser lo más rápido posible.

    En C, por estas razones, la matriz de los valores no existe. Si usted desea obtener el valor de una matriz, lo que se obtiene en cambio, es un puntero al primer elemento de la matriz. Y aquí, de hecho ya está la solución. En lugar de dibujar una matriz de parámetros no válido por adelantado, un compilador de C va a transformar el tipo del parámetro respectivo a ser un puntero. Recuerda esto, es muy importante. El parámetro no será una matriz, sino que va a ser un puntero para el respectivo tipo de elemento.

    Ahora, si tratas de pasar una matriz, lo que se pasa en cambio, es un puntero a las matrices’ primer elemento.

    Excursión: Funciones como parámetros

    Para su finalización, y porque creo que esto le ayudará a entender mejor el asunto, vamos a ver lo que el estado de cosas es cuando intenta tener una función como parámetro. De hecho, la primera no tiene ningún sentido. ¿Cómo puede un parámetro de una función? Eh, queremos una variable en ese lugar, por supuesto! Así que lo que el compilador hace cuando lo que sucede es que, de nuevo, a transformar la función dentro de un puntero a función. Tratando de pasar de una función se le pasa un puntero a la función correspondiente en su lugar. Así, los siguientes son los mismos (de forma análoga al ejemplo de la matriz):

    void f(void g(void));
    void f(void (*g)(void));

    Nota que los paréntesis alrededor de *g es necesario. De lo contrario, se tendría que especificar una función que devuelve void*, en lugar de un puntero a una función que devuelve void.

    De vuelta a las matrices

    Ahora, me dijo al principio que las matrices pueden tener un tipo incompleta – que pasa si no le das un tamaño aún. Desde ya nos dimos cuenta de que un parámetro de matriz es no existente, pero en lugar de cualquier parámetro array es un puntero al array del tamaño no importa. Esto significa que el compilador se encargará de traducir todos los de la siguiente, y todos son la misma cosa:

    int main(int c, char **argv);
    int main(int c, char *argv[]);
    int main(int c, char *argv[1]);
    int main(int c, char *argv[42]);

    Por supuesto, no tiene mucho sentido para ser capaz de poner cualquier tamaño en ella, y es simplemente arrojado. Por esa razón, C99 vino para arriba con un nuevo significado para esos números, y permite a otras cosas que aparecen entre paréntesis:

    //says: argv is a non-null pointer pointing to at least 5 char*'s
    //allows CPU to pre-load some memory. 
    int main(int c, char *argv[static 5]);
    
    //says: argv is a constant pointer pointing to a char*
    int main(int c, char *argv[const]);
    
    //says the same as the previous one
    int main(int c, char ** const argv);

    Las dos últimas líneas de decir que usted no será capaz de cambiar «argv» dentro de la función – se ha convertido en un const puntero. Sólo algunos compiladores de C apoyo a aquellas características de C99, aunque. Pero estas características hacen claro que la «matriz» no es en realidad uno. Es un puntero.

    Una palabra de Advertencia

    Tenga en cuenta que todo lo que dije anteriormente es verdadera sólo cuando usted tiene una matriz como parámetro de una función. Si usted trabajar con matrices, una matriz no será un puntero. Se comportará como un puntero, porque como se explicó anteriormente una matriz serán convertidos a un puntero cuando su valor es de lectura. Pero no debe ser confundido con los punteros.

    Un ejemplo clásico es el siguiente:

    char c[10]; 
    char **c = &c; //does not work.
    
    typedef char array[10];
    array *pc = &c; //*does* work.
    
    //same without typedef. Parens needed, because [...] has 
    //higher precedence than '*'. Analogous to the function example above.
    char (*array)[10] = &c;
    • No sé por qué esto fue votada abajo hoy

Dejar respuesta

Please enter your comment!
Please enter your name here