2009-04-06 6 views
2

Als Hacker-in-Training habe ich beschlossen, meine eigene string_reverse-Funktion zu erstellen, die eine Zeichenfolge verwendet, Speicher für eine neue Zeichenfolge zuweist und einen Zeiger auf eine neue Zeichenfolge zurückgibt, aber I bekomme nicht, was ich begehre, da dies einen Segmentierungsfehler zurückgibt.So interpretieren Sie diesen Debugging-Fehler

#include <stdio.h> 
#include <stdlib.h> 


char* string_reverse(char* string); 

char* string_reverse(char* string) { 
    int len = 0; 
    for (int i = 0; *(string + i) != '\0'; ++i) 
    len++; 

    char* result = (char*)malloc(len * sizeof(char)); 
    if (result == NULL){ 
    puts("Pointer failure"); 
    exit(EXIT_FAILURE); 
    } 

    for (int i = 0; *(string + i) != '\0'; ++i) 
    *(result + (len - i)) = *(string + i); 

    return *result; 
} 

int main() { 
    char* str= "Ni Hao!"; 
    char* result = string_reverse(str); 

    printf("%s\n", result); 
    free(result); 
    return 0; 
} 

Im Gegenzug erhalte ich diese Nachricht Debuggen:

Starting program: /home/tmo/string_reverse 

Program received signal SIGSEGV, Segmentation fault. 
0xb7e5b3b3 in strlen() from /lib/i686/cmov/libc.so.6 

Wie soll ich das Ergebnis interpretieren?

+0

Achten Sie auf die Warnungen, die Ihr Compiler Ihnen gibt. Und wenn es Sie nicht gibt, erhalten Sie einen besseren Compiler. GCC sagt: x.c: In der Funktion 'string_reverse ': x.c: 21: Warnung: Rückkehr macht Zeiger aus Ganzzahl ohne Besetzung –

Antwort

10

Ihr Code hat den umgekehrten String nicht mit dem Nullabschlusszeichen versehen. Als Ergebnis ist die printf-Funktion beim Versuch, die Länge zu berechnen, abgestürzt.

Ändern der malloc Linie auf die folgende

char* result = (char*)malloc((len+1) * sizeof(char)); 

Und Sie müssen die folgende Zeile am Ende der string_reverse Funktion hinzuzufügen, um die Zeichenfolge hat einen Nullabschluss zu gewährleisten.

result[len] = '\0'; 

Paar anderer Kommentare

  • sizeof (char) ist nicht erforderlich. Die Größe des char ist eines der wenigen Typen von der C-Standard definiert ist, und es den Wert 1.
  • Die erste Schleife ist, kann durch einen einfachen Anruf ersetzt werden, um Strlen

EDIT

Zwei andere Probleme. Die Zeile, die tatsächlich die Zeichenkopie ausführt, scheint falsch zu sein. Ich glaube es sollte (len - i - 1) sein. Andernfalls wird das Schreiben des Anfangszeichens bei (Ergebnis + len) erfolgen, was der Ort des Nullabschlusses ist.

*(result + ((len - i) - 1)) = *(string + i); 

Auch führen nicht dereferenzieren auf Rückkehr

+0

Leider erhalte ich immer noch eine Segmentierung Fehler Fehler aus dem Code. – user80285

4

Auch sollten Sie nicht am Ende der Funktion, weil seine allready ein Zeiger auf Ihre resultierenden String dereferencing Ergebnis werden.

return result;