Pointer übergabe führt zum Absturz?

Gast #5224212
Lesenswert?
• ▲
▼
Moin,

kurze Frage. Was mache ich falsch?

Wenn ich den Pointer übergebe, stürzt das Programm ab.
1
char *inBuff = "+ADDR:1234:56:abcdef";

Mache ich es via. Array, klappt es.
1
char inBuff[] = "+ADDR:1234:56:abcdef";
1
int8_t srchCmd(char *inBuff, char *srchCmd)
2
{
3
     char *cmdBeginn   = NULL;
4
     char *cmdEnd       = NULL;
5
     char *rawData    = NULL;    
6
   char cmdStrLen      = strlen(srchCmd);
7
   char inBuffStrLen  = strlen(inBuff);
8
   char rawData_    = 0;
9

10
   if(inBuffStrLen < cmdStrLen)
11
   return -1;
12

13
   /*
14
   *  how much raw data we will received?
15
   */
16
   rawData = strchr(srchCmd,'x');   
17
   if(rawData != NULL)
18
   {
19
     while(*rawData++ != NULL){rawData_++;}
20
   }
Gast #5224221
Lesenswert?
• ▲
▼
Hier noch mal komplett.
1
int8_t srchCmd(char *inBuff, char *srchCmd)
2
{
3
     char *cmdBeginn   = NULL;
4
     char *cmdEnd       = NULL;
5
     char *rawData    = NULL;    
6
   char cmdStrLen      = strlen(srchCmd);
7
   char inBuffStrLen  = strlen(inBuff);
8
   char rawData_    = 0;
9

10
   if(inBuffStrLen < cmdStrLen)
11
   return -1;
12

13
   /*
14
   *  how much raw data we will received?
15
   */
16
   rawData = strchr(srchCmd,'x');   
17
   if(rawData != NULL)
18
   {
19
     while(*rawData++ == 'x'){rawData_++;}
20
   }
21
      
22
     /*
23
     *    search first character from our string without nx
24
     */
25
   char *cmdBeginn_ = malloc(sizeof(char)*cmdStrLen);
26
   strcpy(cmdBeginn_,srchCmd);
27
     
28
     /*
29
     *  mask the nx out
30
     */ 
31
   cmdBeginn_ += (cmdStrLen-rawData_);
32
     *cmdBeginn_ = '\0';
33
     cmdBeginn_ -= (cmdStrLen-rawData_);
34
        
35
     cmdBeginn = strstr(inBuff,cmdBeginn_);
36
   if(cmdBeginn == NULL)
37
     return -2;
38
     
39
     /*
40
     *    search last character from our string
41
     */     
42
     cmdEnd = strrchr(cmdBeginn,cmdBeginn_[cmdStrLen-rawData_]);
43
     if(cmdEnd == NULL)
44
     return -3;
45

46
     /*
47
     *    terminate end of serached string
48
     */
49
     cmdBeginn+=cmdStrLen;
50
     *cmdBeginn = '\0';
51
     cmdBeginn-=cmdStrLen;
52

53
     /*
54
     *    copy the command to "inBuff"
55
     */
56
     strcpy(inBuff,cmdBeginn);
57

58
     return 0;
59
}
60

61
int main(int argc, char *argv[]){
62

63
  char *inBuff = "+ADDR:1234:56:abcdef";  
64
  
65
  printf("Function Result.: %d\r\n",srchCmd(inBuff,"+ADDR:xxxxxxxxxxxxxx"));
66
  
67
  return 0;
68
}
#5224224
Lesenswert?
• ▲
▼
Ist die Funktion so vollständig? Es fehlt wenigstens die letzte 
schließende Klammer. Überprüfe mal ob inBuf in der Funktion nicht 
verändert wird und wenn nicht mache sie const. Wenn du einen Pointer mit 
einem String Literal initialisierst dann zeigt der Pointer auf einen 
const String und dementsprechend sollte der Pointer hier ebenfalls const 
sein.

Ansonsten zeig mal wie du die Funktion aufrufst mit beiden Varianten.

Edit: Wie schon vermutet schreibst du in deinen Pointer der eigentlich 
const sein müsste:
1
strcpy(inBuff,cmdBeginn);
Gast #5224229
Lesenswert?
• ▲
▼
Bei der Zeigervariante liegt dein String eventuell im ROM/Flash.
Bei der Arrayvariante liegt dein String im Array, also RAM.

Je nach Zielsystem kann nicht einfach auf das ROM/Flash zugegriffen 
werden.
Welches ist dein Zielsystem?

Dein Beispiel mit einem PC-Programm umgesetzt funktioniert :-)
Gast #5224233
Lesenswert?
• ▲
▼
DanVet schrieb:
> Bei der Zeigervariante liegt dein String eventuell im ROM/Flash.
> Bei der Arrayvariante liegt dein String im Array, also RAM.
>
> Je nach Zielsystem kann nicht einfach auf das ROM/Flash zugegriffen
> werden.
> Welches ist dein Zielsystem?
>
> Dein Beispiel mit einem PC-Programm umgesetzt funktioniert :-)

Ich nutze es auf dem PC. DevC++
Gast #5224256
Lesenswert?
• ▲
▼
Ihr hattet Recht.
Wenn ich vorher für den Pointer Speicher reserviere, klappt es!
1
int main(int argc, char *argv[]){
2

3

4
  char *inBuff = malloc(sizeof(char)*50);
5
  strcpy(inBuff,"+ADDR:1234:56:abcdef");
6
  
7
  printf("Function Result.: %d\r\n",srchCmd(inBuff,"+ADDR:xxxxxxxxxxxxxx"));
8
  printf(getBlthAddr(inBuff));
9
  
10
  return 0;
11
}
Gast #5225221
Lesenswert?
• ▲
▼
Mal in's blaue geraten : Dein C-Compiler Bildet aus den ASCII-Werten von 
+ADD
eine 32-bittige Zahl und castet sie auf eine Speicheradresse. Auf diese 
Adresse zeigt dann Dein Pointer. Das ist natürlich gequirlter Quatsch 
und gar nicht, was Du willst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 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.