2013-09-24 3 views
0

Буду честным, я полный новичок в c. Таким образом, такие вещи, как malloc и realloc, представляют собой чужие концепции. Я думаю, что у меня есть основы, но я просто не могу получить 100%.Использование строк и Malloc/Realloc

while (int args = scanf("%s", string)) { 
    if (args < 0) break; 
    count++; 

    if (array == NULL) { 
     array = (char *) malloc(strlen(string)); 

     if (array == NULL) { 
      printf("Error allocating memory"); 
      exit(1); 
     } 
    } else { 
     printf("%s %d\n", string, strlen(string)); 
     array = (char *) realloc(array, (sizeof(array) + strlen(string) + 1)); 

     if (array == NULL) { 
      printf("Error allocating memory"); 
      free(array); 
      exit(1); 
     } 

     printf("%lu\n", sizeof(array)); 
    } 

    strcpy(&array[count - 1], string); 
} 

It is reading from terminal - cat file | ./program и представляет собой просто кучу слов произвольной длины. Я пытаюсь собрать их все в массив (массив).

Edit: я должен mentino, что я, видимо, пытается получить доступ к памяти я не выделил: malloc: *** error for object 0x7fe9e04039a0: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug Segmentation fault: 11

+0

' while (int args = scanf ("% s", string)) 'это действительно компилируется в вашей системе? – ouah

+0

Да, как бы вы порекомендовали это сделать? –

+1

Я бы сначала рекомендовал использовать компилятор C для компиляции C, вы, вероятно, используете компилятор C++. – ouah

ответ

2

Похоже, вы не понимаете, что указатели, строки и символ * s в C. Например , here - некоторое описание.

Вот основные проблемы:

  1. символ * не строковый тип. Это указатель на место в памяти, где строковые данные лежат char-by-char и завершается символом char '\ 0' (null terminator)
  2. Таким образом, strcpy просто копирует кучу символов из одного места (строковая переменная) в другую , В вашем случае он копирует их в массив, начиная с элемента count-1. Итак, если вы читаете строку длиной более 1 символа, вы потеряли данные. То, что вы, вероятно, хотите сделать, это сумма длин всех предыдущих строк и запись, начинающаяся с этого места.
  3. Оставшаяся проблема заключается в следующем: вы не выделяете место для нулевого терминатора во время первой итерации (что приводит к тому, что strcpy получает доступ к нераспределенной памяти и, вероятно, приводит к сообщению, которое вы видите после завершения программы).
+0

На самом деле, нет строкового типа в C, который вы можете свободно выделять, конкатенировать и делать разные вещи, как вы это делаете со String в Java или str в Python. Строки здесь представляют собой массивы символов, и все, что вы можете сделать, ограничено стандартными библиотечными функциями и арифметикой указателей. – yeputons

+0

, чтобы суммировать длины всех предыдущих строк, это что-то вроде 'for (i = 0; i

+0

Нет. char * - массив символов.Если вы хотите написать несколько строк, вы можете сделать это, только прочитав их взаимно однозначно, разделив их, например, на нулевые символы. Например: string \ 0other \ 0onemore \ 0. И начала строк будут на массиве [0], в массиве [len1 + 1] и так далее. – yeputons

1

Чтобы упростить процесс, я закончил работу с char ** array вместо char * array. Для каждой итерации моего времени цикла (который, кстати, теперь while (scanf("%s", string) > 0) соответствовать стандартам GCC (я первоначально скомпилирован с г ++)), я realloc с помощью count х sizeof(char *), а затем я могу array[count - 1] = (char *) malloc(sizeof(string + 1) наконец, strcpy(array[count - 1], string)

Смежные вопросы