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
oderchar *
? - 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 Ctypedef char *string;
oder etwas anderes? Was bedeutetGetString()
tun? Ich Schätze, du hast NULL-Zeiger zurück formGetString()
undstrlen()
abgestürzt, weil die. - Ist das C oder C++? Wenn es C, dann ist, wie
string
definiert? Wenn C++, ist esstd::string
oder etwas anderes? Und wenn esstd::string
, wie funktioniertstrlen(s)
selbst kompilieren? Und noch wichtiger, was machtGetString
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 kannNULL
oder andere ungültige Zeichenfolge? (string
ist kein standard-C-Typ, aber ich denke, dassstring
ist ein alias fürchar*
, andernfalls wird der Aufruf anstrlen
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
alsstd::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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Beschreibung der
getString()
Funktion klar, dass es NULL zurückgeben kann, auf einen Fehler oder EOF.Wenn Sie übergeben Sie den Rückgabewert, um
strlen()
ohne Prüfung, wird Ihr Programm Abstürzen.Diese zumindest nicht Abstürzen.
Werden Sie vielleicht auch bemerken, wie viel Verwirrung die
typedef char *string;
Ursachen und wie wenig nutzen Sie verleiht, und es zu Herzen nehmen. Sie haben nicht zu wiederholen die Fehler derer, die Lehre.Ich auch beobachten, dass das code-fragment:
könnte besser sein, und mehr einfach, wie geschrieben:
verkleinern die Zuordnung zu der richtigen Größe.