Hombre, los punteros siguen a darme problemas. Yo pensaba que entendía el concepto.(Básicamente, que utilizaría *ptr cuando se quiere manipular la memoria real guarda en la ubicación que ptr apunta. Solo tienes que utilizar ptr si desea mover el puntero por hacer las cosas como ptr ptr++ o–.) Por lo tanto, si ese es el caso, si se utiliza el asterisco para manipular los archivos que el puntero que apunta, ¿cómo funciona esto:

char *MallocAndCopy( char *line ) {

    char *pointer;
    if ( (pointer = malloc( strlen(line)+1 )) == NULL ) {
        printf( "Out of memory!!!  Goodbye!\n" );
        exit( 0 );
    }
    strcpy( pointer, line );

    return pointer;
}

malloc devuelve un puntero, por lo que yo entiendo por qué el «puntero» en la condición de no utilizar el asterisco. Sin embargo, en la función strcpy, es el envío de los CONTENIDOS de la línea para el CONTENIDO de puntero. No debería ser:

strcpy( *pointer, *line);

????? O es mi entendimiento de los punteros de la correcta y que es sólo la forma en que la función strcpy funciona?

InformationsquelleAutor startuprob | 2010-10-13

11 Comentarios

  1. 6

    Un estilo C de la cadena es un array de caracteres de bytes. Cuando se pasa una matriz alrededor como un puntero al tipo de matriz, el puntero contiene la dirección del primer elemento de la matriz.

    La strcpy función toma el puntero a la primera char de la matriz de origen (que es el inicio de la cadena) y el puntero a la primera char en la matriz de destino, y se itera sobre el origen hasta que llega a un '\0' personaje, que termina la cadena.

    Que también es por eso que cuando usted llame malloc, el tamaño que le pasa es strlen(line)+1, porque necesita asignar uno de los más byte para el carácter de terminación (que yo sepa).

    • única respuesta hasta ahora que parece que la dirección de la confusión real de la OP.
  2. 4

    char* strcpy(char *destination, const char *source) es la firma para strcpy. Se espera obtener punteros como argumentos. En la instancia, pointer ya es un puntero, y así es line.

    strcpy tendrá los punteros source y destination, y copiar el subyacente bytes señaló de source a destination hasta que golpea el \0 (NULL) byte de la cadena apuntada por source, o si le fallas de segmentación porque nunca encuentra que de bytes (sin cadena), y sólo lee en el abismo.

    Si usted utiliza *pointer, que en realidad sería eliminar el puntero y conseguir el char en la dirección que señala el puntero.

  3. 1

    La firma de strcpy es

    char * strcpy ( char * destination, const char * source );

    Usted está enviando en el puntero que es de tipo char*, y la línea que también es de tipo char*. Así, la coincidencia de la firma exactamente como se esperaba. Enviar *puntero o *línea de envío de ‘los valores de estos punteros punto a’ – lo cual sería incorrecto.

  4. 1

    scrcpy toma un puntero, y escribe el contenido apunta a la ubicación señalado por el otro puntero. Es como reescribir el contenido de la celda en la tabla. Usted no necesariamente tiene que cortar y pegar una parte de la tabla, puede volver a escribir los números en ella. En ese caso puntero es sólo una sugerencia de que las células que tienen que tocar.

  5. 1

    Mira la declaración de strpcy().

    char *strcpy(
       char *strDestination,
       const char *strSource 
    );

    Que usted necesita para pasar un puntero. Para no eliminar puntero y línea. Porque eso iba a pasar un char.

  6. 1

    La * está dentro de strcpy.

    La aplicación de la * operador se llama eliminación de referencias, y es exactamente el mismo como la aplicación de la [0].

    strlen y strcpy necesita saber donde las cadenas de inicio para que puedan acceder a todos sus elementos, no sólo la primera.

    El tipo de pointer es char * mientras que el tipo de *pointer es char, es decir, un solo personaje con ningún concepto de los vecinos de los personajes.

  7. 1

    Por escrito *pointer, se puede obtener el carácter que los puntos a (que pasa a ser el primer carácter de la cadena que pointer representa). Pasando a strcpy implica la creación de una copia de ese carácter. Es imposible para strcpy para saber donde debe estar escrito, a menos que le des un puntero a los datos.

    De una manera similar, proporcionando *line sólo estás dando strcpy una copia del primer carácter de la cadena.

    Entonces, estás diciendo básicamente:

    Tengo dos cadenas. No le voy a dar a usted. La primera letra de un es C, la primera letra de los otros es µ. Copiar el contenido de la primera a la segunda

  8. 0

    Veo por qué hay que esperar a pasar *pointer y *line a strcpy. Pero recuerde que pointer apunta a la ubicación de memoria donde se almacena el contenido y donde hay strlen(line)+1 bytes de memoria es reservada y asignados. Así lo strcpy es exactamente hacer es copiar strlen(line) bytes de memoria a partir de la dirección line en las ubicaciones correspondientes, a partir de la dirección de pointer. Si pasa *pointer y *line, strcpy tendrá acceso sólo a la primera char y no el resto de strlen(line)-1. Espero que aclara la confusión acerca de los punteros y por qué tenemos que pasar punteros a strcpy.

  9. 0

    Su entendimiento básico de la strcpy es correcta. La función, de hecho, copia el contenido de line sobre el contenido de pointer. Sin embargo, usted tiene que pasar punteros a la función y no los datos en sí. Esto se hace por varias razones.

    Primero, los datos que se copian es una cadena (es decir, una matriz) y no regular de la variable. Al pasar un array a una función, se puede meter de todo el conjunto en un único argumento de la función por lo que en lugar, usted tiene que pasar un puntero al principio de la matriz. Esta es una limitación de la matriz de paso en C y no es específico de strcpy.

    También, pasar datos a una función, la función con un copia de la variable contenido. Si pasado directamente de los datos (o de referencia punteros) a strcpy, la función sería la de trabajar con copias y no los originales de los datos. Sería incapaz de escribir datos en la cadena original.

    Esencialmente, por la entrega de los punteros a strcpy usted está diciendo que la ubicación de los datos de origen y de destino. La función se encarga de todos los de-referencia interna. En el lenguaje humano, la llamada a strcpy puede ser pensado como «tomar la cadena que comienza en la dirección de memoria line y escribir una copia de partida en la dirección de memoria pointer«. Para comunicarse direcciones de memoria, que el uso de punteros.

  10. 0

    Considerar la strcpy código:

    char * strcpy(char * dst, char* src) 
    {
        int i = 0 ;
        for (;dst[i]=source[i++];);
        return dst ;
    }

    \0(NULO) es el final, tanto de la cadena y el bucle for.

  11. 0

    Su función es básicamente lo que strdup hace. La función está definida en muchos de la plataforma, si no se puede definir de esta manera:

    char * my_strdup(const char* s)
    {
      size_t len = strlen(s);
      char *r = malloc(len+1);
      return r ? memcpy(r, s, len+1) : NULL;
    }

    memcpy es generalmente más rápido que strcpy de cadenas más largas.

Dejar respuesta

Please enter your comment!
Please enter your name here