как исправить ошибки сегментации в c - PullRequest
0 голосов
/ 20 апреля 2019

Это вопрос программирования c, который должен напечатать строку один, два и три, но он не знает, что не так с моим кодом, он продолжает получать ошибку сегментации, если я что-то не так делаю

Это вопрос программирования c, который должен напечатать строку один, два и три, но он не знает, что не так с моим кодом, он продолжает получать ошибку сегментации, если я что-то не так делаю

/*A sample run starts like this for the both of them    
    $ ./a.out    
    one two three   
   */    

// first try compiles with no errors and no warnings 
            int main(){
            char **list, word[20];
            int nwords;
            printf("Enter number of words: ");
            scanf("%d", &nwords);
            list = malloc(nwords * sizeof(char *));
            for(int i = 0; i< nwords; i++){
                scanf("%s", word);
                list[i] = word;
            }
            for(int i = 0; i < nwords; i++){
                printf("%s\n", list[i]);
            }
          }
              // second try compiles with no errors and no warnings
          int main(){
            char **list, word[20];
            int nwords;
            printf("Enter number of words: ");
            scanf("%d", &nwords);
            list = malloc(nwords * sizeof(char *));
            for(int i = 0; i< nwords; i++){
                scanf("%s", word);
                strcpy(list[i], word);
            }
            for(int i = 0; i < nwords; i++){
                printf("%s\n", list[i]);
            }
          }

Примерный запуск начинается так для них обоих
$ ./a.out
один два три

1 Ответ

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

Поскольку list имеет тип char**, вы выделили память для list здесь

list = malloc(nwords * sizeof(char *));

Но вы не выделили память для list[i] здесь

list[i] = word; /* word base address gets copied to list[i] each time which is same*/  

, поскольку word - это массив символов и само его имя адрес , поэтому list[i] каждый раз получает один и тот же базовый адрес , но вы нене хотел этого.

Итак, чтобы преодолеть это, сначала выделите память для каждого list[i], а затем используйте strcpy().

Выделите память для list[i], как

for(int i = 0; i< nwords; i++){
    scanf("%s", word);
    list[i] = malloc(strlen(word)+1); /* allocate memory here */
    strcpy(list[i], word); /* copying the source string content to dest string content */
}

И как только вы закончите динамическую память, освободите динамически выделенную память, вызвав free(), чтобы избежать утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...