2016-03-28 12 views
-3

Warum hört es auf zu arbeiten? Können wir den Namen des Zeigers nicht als Argument für strcpy übergeben? wenn ich es in strcpy(&a,&b); ändern, funktioniert es.Wie benutze ich strcpy für Zeiger?

#include <stdio.h> 

    int main() { 

    char *a; 
    a = "aabtyn"; 

    char *b; 
    b = "mihli"; 

    strcpy(a,b); 

    printf("%s-%s\n",a,b); 


    return 0; 
} 
+1

es funktioniert nicht mit 'strcpy (&a,&b);' –

+0

Obwohl die zugrunde liegende Ursache des doppelten Problem ist das gleiche, das Problem, wie die OP zu sehen ist, sieht anders aus, weil das Schreiben in "strcpy" verpackt ist. Ich stimme dafür, diese Frage erneut zu öffnen. – dasblinkenlight

Antwort

0

Gemäß dem C Standard (6.4.5 String Literale)

7 Es ist nicht spezifiziert, ob diese unterschiedlichen Anordnungen vorgesehen ihre Elemente haben die entsprechenden Werte sind. Wenn das Programm versucht, ein solches Array mit zu modifizieren, ist das Verhalten nicht definiert.

Sie erklärten zwei Zeiger auf Stringliterale

char *a; 
a = "aabtyn"; 

char *b; 
b = "mihli"; 

Dann in dieser Aussage

strcpy(a,b); 

Sie versuchen, wörtliche die erste Zeichenfolge zu ändern. Also ist das Verhalten des Programms undefiniert.

Wie für diese Aussage

strcpy(&a,&b); 

dann wird versucht, den Wert eines Zeigers auf einen anderen Zeiger zu kopieren. Dieser Aufruf hat auch undefiniertes Verhalten. Aber wenn der Wert des zweiten Zeigers ist nullterminierte dann kann dieser Aufruf zu

a = b; 

entspricht also der erste Zeiger gerade neu zugewiesen. In jedem Fall gibt es jedoch undefiniertes Verhalten.

Ein gültiges Programm die folgende Art und Weise aussehen kann

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char s[] = "aabtyn"; 

    char *a = s; 

    char *b; 
    b = "mihli"; 

    strcpy(a,b); 

    printf("%s-%s\n",a,b); 

    return 0; 
} 
1

Kann nicht passieren wir den Namen des Zeigers als Argument für strcpy?

Ja, wir können. Es ist jedoch auch wichtig, dass der Zielzeiger auf einen beschreibbaren Speicher zeigt; in Ihrem Fall, weder a noch b zeigen auf Speicher, der geschrieben werden kann.

Wenn ich es zu strcpy(&a,&b); ändern, funktioniert es.

Wenn es auf Ihrem System zu funktionieren scheint, geschieht dies aus Versehen. Was Sie sehen, ist undefiniertes Verhalten. Damit strcpy arbeiten Sie einen der folgenden Schritte tun müssen:

  • a im automatischen Speicher zuweisen, indem es als char a[] = "aabtyn"; definiert, oder
  • a im dynamischen Speicher zuweisen durch char *a = malloc(7); Aufruf Sie müssen siebte Byte für null Terminator.
0

Wenn Sie:

char source[80],dest[80]; 

initialisieren Quelle, dann:

strcpy(dest,source); 

Aber wenn Sie:

char *pd,*ps; 

initialisieren Quelle und malloc Speicher für * pd, dann:

strcpy(&pd,&ps); 

Und denken Sie daran, frei (pd) zu haben; irgendwo vor Ausgang (0);