c punteros y matrices, copiar el contenido a otra matriz

Sé que esto es probablemente una pregunta básica, pero nunca he comprendido plenamente el conjunto de punteros concepto en C.

Mi pregunta es, decir que tengo una matriz int y me pasa que en una función como
`

int main(){
    int *a = malloc(sizeof(int*)*4);

    //add values to a
    p(a);
}

void p(int *a){
   int *b = malloc(sizeof(int*)*4)
   b = a;
   //change values in b

   //print a b
}`

¿Cuál es la manera correcta de hacerlo para que lo que los cambios que he realizado a b no afecta a los valores de una?

  • Háblame de ella, tomó 4.2 horas de preguntar al azar trajes fuera de la CSC sólo para obtener la URL de este lugar! Supongo que siempre hay Bing, pero, no…
InformationsquelleAutor cHam | 2014-04-10

5 Kommentare

  1. 4

    En su ‘p’ método, que va a asignar el puntero de la b a ser puntero, o, en otras palabras, usted está haciendo b punto a lo que apunta. Cualquier cambio a la b va a provocar cambios en un puesto que tanto el viento apuntando a un mismo bloque de memoria.

    Uso memcpy para copiar bloques de memoria. Sería algo parecido a esto:

    #include <string.h>
    #include <stdlib.h>
    void p(int *a){
       int *b = (int*)malloc(sizeof(int)*4);
       memcpy(b, a, sizeof(int)*4);
    
        //make changes to b.
       b[0] = 6;
       b[1] = 7;
       b[2] = 8;
       b[3] = 9;
    }
    
    int main(int argc, char **argv)
    {
        int *a = (int*)malloc(sizeof(int)*4);
    
        //add values to a
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        a[3] = 4;
    
        p(a);
    
    return 0;
    }
  2. 1

    Acaba de asignar el puntero significa b está apuntando a la misma cantidad de memoria como a y la memoria que acaba de asignar «para b» se ha filtrado. Es asignado, pero no puede liberar más.

    A copiar la matriz que necesitas para bien, copia de la misma.

    Forma fácil es la búsqueda de los diversos memcpy métodos, o simplemente hacer el camino más largo

    for (int i = 0; i < 4; i++) {
        b[i] = a[i];
    }

    Que usted necesita saber acerca de «copia superficial» y «copia profunda» – ya que usted tiene una matriz de int*, lo que puse arriba es una copia superficial. Si usted necesita una copia de los contenidos que cada int* puntos a, necesitará algo más complejo de nuevo.

    • Gran punto de fuga! Creo que es inútil a punto de un puntero a un puntero de matriz. 😀
  3. 0

    Usted está apuntando a y b a dos diferentes bloques de memoria y, a continuación, asignar b para el bloque apuntado por a, causando una pérdida de memoria.

    Y ya no regresan nada de su función p(), usted puede asignar b en la pila (me pregunto qué están haciendo con él).

    Si tu intención es copiar los datos apuntados por estos consejos, usted puede utilizar memcpy o copia de elemento por elemento, como otros han sugerido.

  4. 0
    void p(int *a){
       int *b = malloc(sizeof(int*)*4)
       int size=4;
       while(size>=0){
         b[size--]=a[size--];
       }
       //change values in b
    
       //print a b
    }

    Esto debería funcionar!

    • Gran suposición de que una matriz int está terminada en NULO…
    • Esta es la dirección que puede ser NULL no el valor en sí mismo
    • Tienes razón, se me malinterprete… Pero eso lo hace aún peor: ¿cómo se a nunca ser NULO cuando todo lo que hacen es incrementar este! Bucle infinito! Veo que has editado, así que mi primer comentario es cierto de nuevo.
    • es limitada la memoria asignada a una. Así que si una aumenta, va a pasar a la memoria asignada, finalmente,
    • Correcto. Eso no significa que el valor es 0, significa que está haciendo un «sin inicializar la memoria de lectura» (aka UMR). Si tienes suerte, podrás leer un 0 y detener el bucle antes de intentar leer algo que no está permitido y se estrellan. Escenario más probable es que ya sea un accidente o un bucle infinito. Su supuesto básico de que hay un 0 en el último lugar de la matriz es sólo una convención para char[] cuando se utiliza como cadenas. No es una forzada para cualquier tipo de matriz.
    • estás en lo correcto. He cambiado

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea