Создание динамического массива символов - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь прочитать файл и сохранить слова в динамическом массиве символов. Сейчас я получаю сообщение об ошибке сегментации (ядро сброшено).

Я пытался использовать strdup () и strcpy (), но я получаю ту же ошибку

char ** array;

int main(int argc, char * argv[]){
    int size = 0;
    int i;
    FILE * file;
    char * line;
    size_t len;
    ssize_t read;


    file = fopen("wordsEn.txt", "r");
    if(file == NULL){
            printf("Error coudl not open wordsEn.txt\n");
            return -1;
    }

    while((read = getline(&line, &len, file)) != -1){
            size++;
    }

    array = (char **) malloc((sizeof(char *) * size));
    rewind(file);

    i = 0;
    while((read = getline(&line, &len, file)) != -1){
            //strcpy(array[i], line);
            array[i] = strdup(line);
            i++;
    }

    for(i = 0; i < size; i++){
            printf("%s", array[i]);
    }
}

Я ожидаю, например, массив [0], чтобы вернуть строку «алфавит»

1 Ответ

0 голосов
/ 27 апреля 2019

Я получаю сообщение об ошибке сегментации (сбрасывается ядро).

предупреждение о получении новой выделенной линии через getline каждый раз, когда вам нужно сбросить line в NULL и len в 0 каждый раз, например:

while(line = NULL, len = 0, (read = getline(&line, &len, file)) != -1){

Обратите внимание, что вам не нужно два раза читать файл, вы можете использовать malloc затем realloc для увеличения размера (действительно) динамического массива


A Предложение:

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

int main()
{
  char ** array = malloc(0);
  size_t size = 0;
  FILE * file;
  char * line;
  size_t len;
  ssize_t read;

  file = fopen("wordsEn.txt", "r");
  if(file == NULL) {
    printf("Error coudl not open wordsEn.txt\n");
    return -1;
  }

  while (line = NULL, len = 0, (read = getline(&line, &len, file)) != -1){
    array = realloc(array, (size+1) * sizeof(char *));
    array[size++] = line;
  }
  free(line); /* do not forget to free it */
  fclose(file);

  for(size_t i = 0; i < size; i++){
    printf("%s", array[i]);
  }

  /* free resources */
  for(size_t i = 0; i < size; i++){
    free(array[i]);
  }
  free(array);

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall ar.c
pi@raspberrypi:/tmp $ cat wordsEn.txt 
turlututu foo
bar
loop
pi@raspberrypi:/tmp $ ./a.out
turlututu foo
bar
loop
pi@raspberrypi:/tmp $ 

Казнь под валгриндом:

pi@raspberrypi:/tmp $ valgrind ./a.out
==13161== Memcheck, a memory error detector
==13161== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==13161== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==13161== Command: ./a.out
==13161== 
turlututu foo
bar
loop
==13161== 
==13161== HEAP SUMMARY:
==13161==     in use at exit: 0 bytes in 0 blocks
==13161==   total heap usage: 11 allocs, 11 frees, 5,976 bytes allocated
==13161== 
==13161== All heap blocks were freed -- no leaks are possible
==13161== 
==13161== For counts of detected and suppressed errors, rerun with: -v
==13161== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
...