[C] Anfängerfrage: Warum funktioniert dieses kleine Programm nicht?

Azi

Erfahrenes Mitglied
Hi,

ich hab mal versucht, ein Programm zu schreiben, welches zwei Strings zusammenfügen soll. Leider endet die ganze Sache mit nem Segfault...

C:
#include <stdio.h>

char* merge(char* arr1, char* arr2){
 char* start=arr1;
 while(*arr1){
  arr1++;
 }
 while(*arr2){
  *arr1=*arr2;
  arr1++;
  arr2++;
 }
 return start;
}

int main(){
 char* foo='abc';
 char* blubb='def';
 printf(merge(foo,blubb));
 return 0;
}

Könnte mir hier jemand helfen und sagen, warum dies nicht funktioniert?

Danke,

Azi
 
Hallo,

in der zweiten Schleife schreibst du in einen Speicherbereich, der möglicherweise nicht reserviert ist. Du kannst nicht davon ausgehen, dass an der Adresse arr1 beliebig viel Speicher existiert, in den du reinschreiben darfst.

Grüße,
Matthias
 
Kann daran liegen liegen, dass arr1 eine feste Länge hat und Du über den Speicher hinaus dazu kopierst. Für derartige Funktionen eignen sich besser "strcat" oder "strcpy" umZeichenketten zusammen zu führen

Matthias war schneller :D
 
Für derartige Funktionen eignen sich besser "strcat" oder "strcpy" umZeichenketten zusammen zu führen
Danke für den Hinweis, aber genau das wollte ich mal selber probieren, um ein wenig Einführung zu bekommen :)

Okay, Ich habe nun versucht, das zu beheben und lege nun ein Extra-Array an. Allerdings kompiliert das Programm leider nicht:

C:
#include <stdio.h>

char* merge(char* arr1, char* arr2){
 int l1=0,l2=0;
 char* tarr1=arr1,tarr2=arr2;
 while(*tarr1) l1++;
 while(*tarr2) l2++;
 char start[l1+l2];
 char* ret=start;
 while(*arr1){
  *start=*arr1;
  start++;
  arr1++;
 }
 while(*arr2){
  *start=*arr2;
  start++;
  arr2++;
 }
 return ret;
}

int main(){
 char* foo='abc';
 char* blubb='def';
 printf(merge(foo,blubb));
 return 0;
}

Code:
arraymerge.c: In function `merge':
arraymerge.c:5: warning: initialization makes integer from pointer without a cast
arraymerge.c:7: error: invalid type argument of `unary *'
arraymerge.c:12: error: wrong type argument to increment
arraymerge.c:17: error: wrong type argument to increment
arraymerge.c:24:12: warning: multi-character character constant
arraymerge.c: In function `main':
arraymerge.c:24: warning: initialization makes pointer from integer without a cast
arraymerge.c:25:14: warning: multi-character character constant
arraymerge.c:25: warning: initialization makes pointer from integer without a cast
 
Ich vermute, irgend ein Zeiger schlägt quer ;)

probier's mal so:

Code:
char *merge(const char *arr1, const char *arr2) { // const ist hier besser, um die Daten konstant zu halten
  int len = strlen(arr1)+strlen(arr2) + 1; // plus 1 Zeichen mehr, um die zeichenkette zu terminieren
  char *newChar = (char *)malloc(len); // Speicher reservieren
  memset(newChar, '\0', len); // mit NULL füllen  

  // Neues Array füllen
  int i;
  for( i = 0; i < strlen(arr1); i++ )
    newChar[i] = arr1[i];
  
  // An neues Array anhängen
  int j;
  for( j = 0; j < strlen(arr2);j++ ) {
    i++;
    newChar[i] = arr2[j];
  }

  return newChar;
}
 

Neue Beiträge

Zurück