2013-03-05 26 views
7
#include <stdlib.h> 
#include <stdio.h> 

int main (void) 
{ 
    int a[] = {1,2,3,4,5}; 
    int b[] = {0,0,0,0,0}; 
    int *p = b; 

    for (int i =0; i < 5; i++) 
    { 
     b[i] = a[i]+1; 
     *p = a[i]+1; 
     p++; 
    } 
    for (int i = 0; i < 5; i++) 
    { 
     printf (" %i \t %i \t %i \n", *p++, b[i], a[i]); 
    } 
    return 0; 
} 

Per questo codice si ottiene perché l'output per aeb ma perché il puntatore ha lo stesso valore di a?c puntatori e array

* p è b [0] = a [0] +1, non è vero? Quindi p ++ significa l'indirizzo successivo per b quindi è b [1] = a [1] +1.

ie 
*p b a 
1 2 1 
2 3 2 
3 4 3 
4 5 4 
5 6 5 
+0

È mislabeled le colonne: dovrebbe essere '* p b a', non' a b * p'. – dasblinkenlight

+0

sì, il mio male. Fixato – user2135885

+0

Per motivi di cambiamento-resistenza, meglio fare 'int b [sizeof (a)/sizeof (a [0])] = {...' e sostituire i valori '5' con lo stesso termine. In questo modo, puoi cambiare l'array 'a' e tutto andrà bene. – glglgl

risposta

9

Hai trovato comportamento indefinito. Alla fine del primo ciclo, p punta a "uno dopo la fine" di b. Senza resettarlo, lo si denota e si continua ad incrementarlo, entrambi i quali causano il comportamento non definito .

E può essere che sulla vostra implementazione matrice a viene memorizzata subito dopo la serie b e che p ha iniziato a puntare in una matrice a. Questo sarebbe un possibile "non definito" comportamento.

+0

quindi in pratica può essere qualsiasi cosa, solo in questo caso sembra puntare al prossimo indirizzo nella memoria in questo caso che punta all'elemento di partenza dell'array a? correggimi se sbaglio. Grazie – user2135885

+0

esattamente. può essere qualsiasi cosa Il caso migliore è che si blocca in modo da essere consapevoli che qualcosa non va in anticipo. – UmNyobe

+0

@ user2135885: Per me sembra una spiegazione ragionevole anche se è possibile che ci sia un motivo più oscuro per la coincidenza che stai vedendo. –

-2

non si dovrebbe creare un ciclo separato per la stampa e l'incremento dei valori dell'array. fare sia in stesso anello e fare la follouwing per ottenere ur uscita :) #include #include

int main(void) 
{ 

int a[]={1,2,3,4,5}; 
int b[]={0,0,0,0,0}; 
int c[]={0,0,0,0,0}; 
int *p; 
int i; 
p=c; 
for(i =0 ; i<5 ; i++) 
{ 
    b[i]=a[i]+1; 
    *p=b[i]-1; 
    //*p++; 

//for(i =0 ; i<5 ; i++) 

    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]); 

} 
return 0; 
} 
1

dopo la prima per {}, punto p in b [5], ma la dimensione b è 5 , quindi b [5] valore non è noto, printf * p ha lo stesso valore di [i], il motivo potrebbe essere nella memoria b [5] è un [0].

1

Penso che quello che dovete fare è aggiungere un p = p - 5;

#include <stdio.h> 
int main (void) 
{ 
    int a[] = {1,2,3,4,5}; 
    int b[] = {0,0,0,0,0}; 
    int *p = b; 
     int i =0; 

    for (i =0; i < 5; i++) 
    { 
     b[i] = a[i]+1; 
     *p = a[i]+1; 
     p++; 
    } 
    p = p - 5; 
    for (i = 0; i < 5; i++) 
    { 
     printf (" %i \t %i \t %i \n", *p++, b[i], a[i]); 
    } 
    return 0; 
} 
+0

meglio: 'p = b' di nuovo, poiché il' 5' potrebbe cambiare. – glglgl