memcpy stürtzt immer ab

Gast #6400616
Hallo,
ich habe ein Problem, dass meine memcpy-funktion unter windows10 immer 
abstürzt
Das hier momentan eh noch null raus kommt ist mir klar. Das array wird 
an einer anderen stelle beschrieben. Aber ob 0 oder andere Werte, das 
Problem bleibt, dass es abstürzt.
Auch komme ich nicht außerhalb des arrays. 500+64=564, array ist aber 
2000 lang.


file 1
1
// ADDRESS_BASE = 500;
2
// GROESSE_TABELLE = 64;
3
// uint8 destination[64]
4
readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);

file 2
1
sint32 readData (uint32 addr_u32, uint32 *data_pu32)
2
{
3
    sint32 err_s32;
4

5
    err_s32 = dataInput(&addr_u32, (uint8*) data_pu32, sizeof(uint32));
6

7
    return err_s32;
8
}

file 3
1
uint8 data[2000] = {0};
2

3
sint32 dataInput(uint32 *src, uint8 *dest, uint16 bytes_u16)
4
{
5
        memcpy( dest, &data[*src], bytes_u16);
6
}
Gast
Marcel schrieb:
> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);

Marcel schrieb:
> sint32 readData (uint32 addr_u32, uint32 *data_pu32)

Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du 
übergibst 3?

Warum debuggst das Programm nicht einfach mal? Setze einen Breakpoint 
auf das memcpy und überprüfe die Parameter.
Gast
Programmierer schrieb:
> Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du
> übergibst 3?

PS: Und der 2. Parameter ist uint32 *, aber du übergibst uint8_t*. Das 
darf so gar nicht kompilieren. Was sind sint32 und uint32 eigentlich für 
komische Typen? Die gibt's in C und C++ gar nicht.
Gast
Nick M. schrieb:
> K.A. was dabei rauskommt, wenn man die Adresse eines Parameters haben
> will.

Die Adresse des Werts auf dem Stack. Das funktioniert schon. Wobei man 
sich schon fragt, warum das überhaupt als Pointer an dataInput übergeben 
wird.
Mit den Codefragmenten und den fehlenden Definitionen ist das arg schwer 
nachvollziehbar. Und es ist vermutlich auch nicht der Code, den du in 
deinem Programm probiert hast, denn du übergibst beim Aufruf von 
readData() drei Argumente, aber die Funktion hat nur zwei Parameter.
Gast
Programmierer schrieb:
> Marcel schrieb:
>> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);
>
> Marcel schrieb:
>> sint32 readData (uint32 addr_u32, uint32 *data_pu32)
>
> Da passt was nicht zusammen. readData nimmt 2 Parameter, aber du
> übergibst 3?

Ja, da ist wohl was durcheinander gekommen

file 2.c
1
int32 readData(uint32 addr_u32, uint8 *data_pu8, uint16 size_u16)
2
{
3
    sint32 err_s32;
4

5
    err_s32 = dataInput(addr_u32, data_pu8, size_u16);
6

7
    return err_s32;
8
}
Programmierer schrieb:
> Nick M. schrieb:
>> K.A. was dabei rauskommt, wenn man die Adresse eines Parameters haben
>> will.
>
> Die Adresse des Werts auf dem Stack. Das funktioniert schon. Wobei man
> sich schon fragt, warum das überhaupt als Pointer an dataInput übergeben
> wird.

Ja, da wird erst der Wert übergeben, dann die Adresse des Parameters 
genommen, an eine weitere Funktion übergeben, die ihn dann wieder 
dereferenziert. Auch die Wahl der Datentypen wirkt etwas konfus. Da ist 
z.B. destination ein Array aus uint8, wird aber per Zeiger auf uint32 
übergeben, nur um dann in der Funktion wieder auf uint8* gecastet und 
als solcher weitergegeben zu werden.
Gast
Marcel schrieb:
> err_s32 = dataInput(addr_u32, data_pu8, size_u16);

Das funktioniert nicht. dataInput will einen Pointer als 1. Parameter.

Einzelne Code-Fragmente copy-pasten oder gar abschreiben bringt nichts. 
Reduziere dein tatsächliches Programm auf das minimale Programm, welches 
exakt das Problem hat, und zeige exakt das gesamte Programm, welches 
wir dann selbst ausprobieren und prüfen können. Sonst ist das hier nur 
Rätselraten.

https://stackoverflow.com/help/minimal-reproducible-example
Gast
Was du mit dem ADDRESS_BASE machst ist komplett wirr.
Es ist keine Adresse, sonder ein Index. Und von dem Index nimmst du die 
Adresse (die auf den Stack zeigt) und dort kopierst du hin. Also auf den 
Stack. Das muss abstürzen.
Marcel schrieb:
> // ADDRESS_BASE = 500;
> // GROESSE_TABELLE = 64;
> // uint8 destination[64]
> readData(ADDRESS_BASE, &destination[0], GROESSE_TABELLE);

Wie wird die "ADDRESS_BASE" verwaltet? Du kannst nicht einfach Speicher 
an beliebigen Stellen belegen, sondern musst ihn vorher mit malloc (C) 
oder mit new (C++) anfordern. Diese Funktionen geben Dir dann eine 
Adresse zurück und da darfst Du dann reinschreiben.
Stimmt, in dem neuen Codefragment ist plötzlich alles anders.
Also, bitte ein minimales, aber vollständiges Beispiel, das genau so 
den von dir beobachteten Absturz zeigt, posten. Mit den jetzigen Angaben 
kann man einfach nichts anfangen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.