2013-04-09 7 views
0

Я запускаю программу в C. Когда я запускаю программу, я получаю ошибку ошибки сегментации. IN gdb, когда я возвращаюсь, это говорит мнеC строка из GetString(), когда strlen производит ошибку сегментации

Программный сигнал SIGSEGV, ошибка сегментации. __strlen_sse2_bsf() в ../sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S:51 51 movdqu (% EDI), % XMM1

Я считаю, что он должен делать с StrLen.

Единственный раз, когда я использую StrLen является:

string s = GetString(); 

    int stringlength = strlen(s); 

При изменении StrLen для SizeOf ошибки останавливается.

Что не так с моим кодом?

Документация 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; 
} 
+1

Что делает 'GetString'? Я предполагаю, что вы не удалили свою строку ... –

+0

Что такое '' string''? '' std :: string'' или '' char * ''? – gongzhitaao

+0

@LeeTaylor Я предполагаю, что он возвращает строку C. Следовательно, ваша проблема - это тип C++, тогда как strlen требует массив символов с нулевым символом. – SevenBits

ответ

4

Описание функции getString() четко сказано, что он может возвращать NULL в случае ошибки или EOF.

Если вы передадите возвращаемое значение strlen() без проверки, ваша программа выйдет из строя.

string s = GetString(); 
int stringlength = 0; 

if (s != 0) 
    stringlength = strlen(s); 

Это, по крайней мере, не сбой.

Вы также можете заметить, насколько путают причины, и как мало пользы оно приносит, и примите это к сердцу. Вам не нужно повторять ошибки тех, кто вас учит.

Я также заметить, что фрагмент кода:

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

может быть лучше, и более просто, написано как:

string minimal = realloc(buffer, n + 1); 

, чтобы уменьшить выделение до нужного размера.

+0

спасибо, строка проверки для null, прежде чем я использую strlen, решил мою проблему. спасибо – IberoMedia