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

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