Verständnisfrage zu char

Gast #905891
Lesenswert?
• ▲
▼
Hallo zusammen,  wie gesagt habe ich eine Verständnisfrage zu char´s.
Ich habe folgende Zeilen:
1
 char Eheit2 =65;// 'A';

Diese Variable rufe ich in einer Funktion
1
 void xy (char *string, char* Einheit)

folgendermaßen auf.
1
 xy (Messwert, &Eheit2);

Nur wird beim Sprung in die Funktion die Variable ungewollt erweitert.
In der Funktion ist Einheit später sowas wie "A1200".

Die Variable Messwert ist ein char array.
1
 char Messwert[5];

Wenn ich aber so deklariere
1
 char *Eheit2 ={"A"};

läuft alles richtig.
Kann mir einer auf die Sprünge helfen??
Gast #905896
Lesenswert?
• ▲
▼
Zeig mal den Rest vom Code... sonst ist raten angesagt...

Ich versuch mich mal am Raten. Du verwnedest in den Funktionen irgendwo 
eine string Funktion? Sowas wie strcpy vielleicht?
1
char Eheit2 =65;// 'A';
Hier fehlt die abschließende 0, der einen String abschließt. Bei der 
Version:
1
char *Eheit2 ={"A"};
wird diese 0 automatisch hinzugefügt, da "" ein string kennzeichnet -> 0 
am Schluss.
#905904
Lesenswert?
• ▲
▼
Was machst du den später damit? printf? char * wird auch als string 
benutzt, das ist eine Zeichenkette, die mit einer null abgeschlossen 
wird. Wenn du "A" schreibst, ist das so ein String, in Wirklichkeit zwei 
Bytes, einer mit 65, einer mit null. 'A' hingegen nur ein Zeichen - ohne 
die abschließende null.

Ich vermute, dass du so etwas wie printf damit aufrufst und dann wird 
alles im Speicher ausgegeben - nicht nur das eine Zeichen -bis 
zufälligerweise irgendwann eine null auftaucht. Der Compiler meckert 
hier nicht, da es sich um einen logischen und nicht syntaktischen Fehler 
handelt.

-Mist, zu langsam. ;)
Gast #905910
Lesenswert?
• ▲
▼
1
  
2

3
char Messwert[5]; 
4
short xxx = 4;
5
int DatenWert =piffpaff, valuetowrite;
6
char *Eheit2 = {"A"};
7

8
while (xxx >=0)
9
  {
10
    if (DatenWert == 0)
11
      {
12
      Messwert[xxx] = 48;     //Entspricht der Null im ASCII
13
      xxx-=1;
14
      }
15
    else
16
    {
17
    valuetowrite = (DatenWert % 10);
18
    Messwert[xxx] = valuetowrite + 48;
19
    DatenWert = (DatenWert - valuetowrite)/10;
20
    xxx -=1;
21
    }
22
  }
23

24
UC1617_write_string_messwert(Messwert, Eheit2);

So sieht das bis zur aufrufenden Funktion aus.
Ich wandle einen short in ein char um und übergebe ihn incl. Einheit an 
die Funktion.

Und die Funktion sieht folgendermaßen aus:
1
void UC1617_write_string_messwert(char *string, char *Einheit)
2
{
3
 short n,u,uEinheit;
4
 char *Buchstabe = string;
5
 char *Eheit = Einheit;
6
  
7
  while (*Buchstabe == 48)    //Bleibt in der Schleife, solange ein Messwert eine 0 an erster Stelle hat.
8
          Buchstabe++;
9
  
10
  u = strlen (Buchstabe);
11
  uEinheit = strlen (Eheit);
12
 
13
     for (n=1; n<=((16 - (u+uEinheit))/2);n++)            //Auffüllen mit " "
14
      {
15
      UC1617_write_char(' ',Features);      //bis Mitte
16
      x+=2;
17
      } 
18
     
19
     while(*Buchstabe != '\0')
20
      {
21
        
22
      write_char (*Buchstabe,Features);
23
      Buchstabe ++;
24
      }
25
     
26
     while(*Eheit != '\0')
27
      {
28
        
29
      write_char (*Eheit,Features);
30
      Eheit ++;
31
      }
32
     for (n = (x+(2*u)); n<32;n+=2)                   //Auffüllen mit " "
33
      write_char(' ',Features);      //bis Zeilenende
34
    
35
}

Das ganze schreibt einen Wert auf ein Display.
Gast #905931
Lesenswert?
• ▲
▼
Habe in einem Buch folgendes gelesen.

Aber Achtung, nachstehendes Programm könnte böse Folgen haben:
1
#include <stdio.h>
2

3
int main()
4
{
5
   int *y;
6
   *y=10;
7
   printf("Der Wert von *y ist %d\n",*y);
8
   return 0;
9
}

Dem Zeiger y wurde hier zuvor keine gültige Adresse zugewiesen. Dies 
bedeutet, dem Zeiger y steht beim Start des Programms eine Adresse zur 
Verfügung, die durch ein zufälliges Bitmuster vom Linker erzeugt wurde. 
Das Programm kann theoretisch sogar korrekt ablaufen. Irgendwann kann 
(wird) es jedoch ein vollkommen falsches Ergebnis zurückliefern. Auch 
könnte es sein, dass auf einen Speicherbereich zugegriffen wird, der 
bereits Daten beinhaltet. Dies könnte zu erheblichen Problemen bei der 
Programmausführung bis hin zum Absturz führen.

Ist das nicht genau das was ich gemacht habe?
Gast #905939
Lesenswert?
• ▲
▼
Ok das ist was anderes. hier hast du zunächst einen Zeiger der irgendwo 
im Speicher hinzeigt.
1
int *y;

Dort schreibst du dann 10 rein! Überschreibst also wenn du pech hast was 
anderes.

aber bei
1
char *Zeiger = "TEXT";
wird der Zeiger auf den String "TEXT" im Speicher gelegt. Dieser String 
wurde zuvor aber im Speicher abgelegt und hat für ihn zugeordneten 
Speicher erhalten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren