3 Stimmen

Busfehler: 10. C-Code, malloc-Beispiel

Wenn ich versuche, den folgenden C-Code zu kompilieren, erhalte ich einen Busfehler. Ich vermute, es hat etwas mit der Art und Weise zu tun, wie ich memcpy aufgerufen habe, aber ich kann es nicht herausfinden. Für jede Hilfe wäre ich sehr dankbar!

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

int main()
{

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p
    p = "hello";

    char *name = (char*)malloc(sizeof(char)*11);
    // Assign some value to name
    name = "Bye";

    memcpy (p,name,sizeof(char)*10); // Problem begins here
    return 0;
}

10voto

Ray Toal Punkte 82654

Aquí p zeigt auf ein String-Literal nach der Zuweisung, NICHT auf den zugewiesenen Speicher!

Dann versuchen Sie, in diesen Speicher zu schreiben mit memcpy .

Viele C-Compiler weisen String-Literale im Nur-Lese-Speicher zu, daher der Busfehler.

Um Ihr Problem zu lösen, sollten Sie kopieren. die Zeichen h, e, l, l und o in den Platz, den Sie für p in der ersten Zeile von main , mit strncpy . Dies hält p die auf den von Ihnen selbst zugewiesenen Speicher verweist; die spätere memcpy ist in Ordnung (vorausgesetzt natürlich, dass Sie Ihren Puffer nicht überlaufen lassen).

Beachten Sie, dass Sie bei der direkten Zuweisung an eine String-Variable im Allgemeinen die Variable auf eine andere Speicheradresse verweisen lassen. In Ihrem Code haben Sie Platz für mehrere Strings zugewiesen, aber wenn Sie den Variablen String-Literale zuweisen, ändern Sie den Speicherort, auf den sie zeigen, und verursachen so ein Speicherleck.

0voto

madper Punkte 796

In Ihrem Code bedeutet das p = "hello" les "hello" einen Zeiger zurückgeben, der auf eine Zeichenkette zeigt hello und das "Hallo" kann nicht geändert werden. Sie verwenden p = "hello" bedeutet machen p auch auf diese Zeichenfolge verweisen. Wenn Sie also versuchen, sie zu ändern, erhalten Sie einen Fehler. Der richtige Weg ist wie folgt: char a[] = "hello"; oder

char *a = malloc(sizeof(char)*11); /*cast is not good*/
strcpy (a, "hello");

Übrigens, verwenden Sie malloc sollte besser NICHT eine Besetzung wie (char *) o (int *) .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X