C-string aus GetString() auf, wenn strlen erzeugt einen segmentation fault

Ich arbeite mit einem Programm in C. Wenn ich das Programm starte bekomme ich einen segmentation fault Fehler. IN gdb, wenn ich backtrace sagt es mir

Program received signal SIGSEGV, Segmentation fault.
__strlen_sse2_bsf () at ../sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S:51 51 movdqu (%edi),
%xmm1

Ich glaube, es hat zu tun mit strlen.

Die einzige Zeit, die ich verwenden strlen ist:

    string s = GetString();

    int stringlength = strlen(s);

Wenn ich strlen für sizeof Fehler Stoppt.

Was ist falsch an meinem code?

Dokumentation von GetString

/*
 * Reads a line of text from standard input and returns it as a 
 * string (char *), sans trailing newline character.  (Ergo, if
 * user inputs only "\n", returns "" not NULL.)  Returns NULL
 * upon error or no input whatsoever (i.e., just EOF).  Leading
 * and trailing whitespace is not ignored.  Stores string on heap
 * (via malloc); memory must be freed by caller to avoid leak.
 */

string GetString(void) {
    //growable buffer for chars
    string buffer = NULL;

    //capacity of buffer
    unsigned int capacity = 0;

    //number of chars actually in buffer
    unsigned int n = 0;

    //character read or EOF
    int c;

    //iteratively get chars from standard input
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        //grow buffer if necessary
        if (n + 1 > capacity)
        {
            //determine new capacity: start at 32 then double
            if (capacity == 0)
                capacity = 32;
            else if (capacity <= (UINT_MAX / 2))
                capacity *= 2;
            else
            {
                free(buffer);
                return NULL;
            }

            //extend buffer's capacity
            string temp = realloc(buffer, capacity * sizeof(char));
            if (temp == NULL)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }

        //append current character to buffer
        buffer[n++] = c;
    }

    //return NULL if user provided no input
    if (n == 0 && c == EOF)
        return NULL;

    //minimize buffer
    string minimal = malloc((n + 1) * sizeof(char));
    strncpy(minimal, buffer, n);
    free(buffer);

    //terminate string
    minimal[n] = '\0';

    //return string
    return minimal;
}
  • Was bedeutet GetString tun? Ich vermute, Sie hat nicht null beenden Ihren string...
  • was ist string? std::string oder char *?
  • Ich nehme an, es gibt einen C-string. Dein problem ist, dann ist die saite ist ein C++ - Typ, in der Erwägung, dass strlen erfordert ein null-terminiertes array von Zeichen.
  • Du hast uns nicht gegeben genug Informationen, um endgültige. Was ist der Typ string? Ist es eine C++ - std::string oder eine C typedef char *string; oder etwas anderes? Was bedeutet GetString() tun? Ich Schätze, du hast NULL-Zeiger zurück form GetString() und strlen() abgestürzt, weil die.
  • Ist das C oder C++? Wenn es C, dann ist, wie string definiert? Wenn C++, ist es std::string oder etwas anderes? Und wenn es std::string, wie funktioniert strlen(s) selbst kompilieren? Und noch wichtiger, was macht GetString eigentlich zurück?
  • was macht Sie denken, dies ist eine C++ - Frage als eine C-Frage, wie der OP es markiert?
  • Sorry für meine Verwirrung; jemand verändert die Sprache, tag aus irgendeinem Grund. Aber wir müssen noch wissen, was GetString tut, da Ihr code-snippet, das impliziert, dass es nicht wieder eine gültige null-terminierte Zeichenfolge.
  • Es ist C-Sprache. die GetString() ist eine Funktion, die mir von der Schule. Ich bin ein Anfänger in dieser Sprache. wenn Sie Fragen, welche Art von Zeichenfolge? die variable geben, die ich gegeben wurde, um Programm erstellen ist, dass es ein "string". Unter der Annahme, dass das problem ist, dass es keine null-terminator in den string GetString gibt für mich, wie könnte ich hinzufügen, dass der terminator auf die Zeichenfolge?
  • Hat deine Schule geben Ihnen die Dokumentation für das, was GetString tut? Insbesondere gibt es Situationen, in denen es zurückgeben kann NULL oder andere ungültige Zeichenfolge? (string ist kein standard-C-Typ, aber ich denke, dass string ist ein alias für char*, andernfalls wird der Aufruf an strlen nicht kompilieren). Wie es ist, ich glaube nicht, dass die Frage hier beantwortet werden können; versuchen Sie es mit dem debugger zu schauen, weiter oben in der Ablaufverfolgung zu erstellen, und überprüfen Sie die Werte aller Zeiger verwendet wird.
  • Viele der Fragen, die Menschen haben, die gefragt wurden, beantwortet werden, indem eine minimale, <strong>kompilierbare</strong> testcase. Indem Sie nicht wie ein testcase, du machst uns um Hilfe bitten, anstatt um Hilfe zu bitten, selbst; Wir müssen uns Fragen, was ist das? und was ist das?. Um Hilfe bitten, den richtigen Weg, oder können wir Ihnen nicht helfen!
  • Wie ich bereits erwähnt ich bin ein Anfänger in dieser Sprache. Wenn ich die Frage gepostet ich wusste nicht, dass GetString war nicht Teil von stdio.h Wenn Sie erwarten perfekte Fragen wahrscheinlich stackoverflow Publikum, in diesem Fall moi, vielleicht ist die website nicht notwendig wären. Ich weiß nicht, was kompilierbar testcase ist.
  • Sorry, mein Fehler. Die Frage an den Anfang, nicht enthalten die GetString-definition, so dass ich verwechselte string als std::string (nun gut, das kann auch nicht kompilieren, da hätte ich mehr aufpassen, wenn retagging)
  • testcase" bedeutet genug code ist gegeben, dass wir das können, erstellen Sie eine ausführbare Datei und führen Sie es uns, ohne dass wir zusätzlichen code schreiben (und möglicherweise ungültige Annahmen in den Prozess).
  • danke, Sie haben beide Recht. Auch ich wünschte, ich könnte formulieren, meine Fragen besser. Ich bin daran arbeiten

InformationsquelleAutor IberoMedia | 2013-04-09
Schreibe einen Kommentar