Forum: Compiler & IDEs wieder mal global variablen


von Sigi__ (Gast)


Lesenswert?

Hallo,

ich checks einfach nciht mehr. Ich versuche ein Struct global zu machen, 
aber meine enthaltenn Pointer änderen sich in Unterfunktionen.
Hier mal ein Auszug:
1
//send_string.h
2
typedef struct {
3
    char       *msg;
4
    int32_t  characters;
5
    char       *dataptr;
6
    } eth_msg;
7
        
8
extern eth_msg message;
9
//-----------------------------------------
10
11
12
//send_string.c
13
void test(void)
14
{
15
  rs232_puti(message.dataptr);
16
  //liefert 11128
17
}
18
....
19
//-----------------------------------------
20
21
//main.c
22
include "eth_string.h"
23
eth_msg  message;
24
25
main()
26
{ 
27
  message.dataptr = malloc(500);
28
  rs232_puti(message.dataptr);
29
  //liefert 4640
30
  test();
31
}
32
//-----------------------------------------

Ich verstehs nicht. Für mich ist die Variable global. Was mache ich da 
falsch?

von Stefan E. (sternst)


Lesenswert?

1
//send_string.h
2
typedef struct {
3
...
4
...
5
//main.c
6
include "eth_string.h"

Hast du in eth_string.h und send_string.h vielleicht unterschiedliche 
Struct-Deklarationen drin?

von Sigi__ (Gast)


Lesenswert?

Ups. War ein Tippfehler. Da kam wohl ein anderer Thread in meinem Kopf 
mit dem Tippo-Thread durcheinander. :)

Das soll natürlich include "include "send_string.h" heißen!

von Oliver (Gast)


Lesenswert?

>malloc(500);

Auf welcher Hardware läuft das Programm?

Oliver

von Stefan E. (sternst)


Lesenswert?

Sigi__ wrote:
> Ups. War ein Tippfehler. Da kam wohl ein anderer Thread in meinem Kopf
> mit dem Tippo-Thread durcheinander. :)

Da muss wohl mal wieder ein Standardspruch her:
Es ist meist keine gute Idee, Code "einzutippen".
Bitte immer Originalcode posten, also am besten per Cut&Paste 
einfügen. Und etwas mehr Kontext wäre auch nicht schlecht, also am 
besten den kompletten Code posten.

von lkmiller (Gast)


Lesenswert?

Was macht
:
rs232_puti()
:
Wenn diese Routine Zeichen über RS232 verschickt (put integer??),
dann sollte niemals nicht mehr als 500 rauskommen, oder?

Es gehört zum guten Stil, den Rückgabewert von malloc auf NULL zu 
testen. NULL wird dann von malloc zurückgegeben, wenn kein Speicher 
entsprechender Größe allokiert werden konnte.
malloc() reserviert nur Speicher, der muss danach noch initialisert 
werden.
:
  if(NULL==(message.dataptr = malloc(500)))  exit(1); // Fehler, Schluss
  memset(message.dataptr,0,500);
  rs232_puti(message.dataptr);
:
Sonst gibts amoklaufende Pointer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.