Получение ошибки сегмента, но не знает, как это исправить - PullRequest
0 голосов
/ 20 апреля 2019

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

#include <stdio.h>
#include <ctype.h>
int main() {
    char *str[4];
    char c[2];
    for (int i = 0; i < 4; i++)
        scanf("%s", str[i]);
    int find = 0;
    while (find <= 2 && *str[0] != '\0' && *str[1] != '\0') {
        if (isalpha(*str[0]) && *str[0] == *str[1]
            && *str[0] - 'A' >= 0 && *str[0] - 'A' <= 25) {
            find++;
            if (find == 1)
                c[0] = *str[0];
            else if (find == 2)
                c[1] = *str[0];
        }
        str[0]++;
        str[1]++;
    }

   /* ... */
}

Ответы [ 2 ]

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

Здесь

char *str[4]; /* what str[0] contains ? some junk data, need to assign valid address */
for (int i = 0; i < 4; i++)
   scanf("%s", str[i]); /* No memory for str[i] here */

str - это массив символьных указателей , и они не инициализированы, т.е. не указывают ни один действительный адрес.Одним из способов решения этой проблемы является выделение памяти для каждого указателя на символ , после которого вы можете поместить некоторые данные в str[i].Например,

char *str[4];
for (int i = 0; i < 4; i++) {
   str[i] = malloc(MAX); /* define MAX value as per requirement */ 
   scanf("%s", str[i]); /* Now str[i] has valid memory */
}

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

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

Вы забыли выделенную память для строки.

Ваш код с динамически выделенной памятью.

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h> //needed for malloc and free
int main() {
    char *str[4];
    //allocate memory
    for (int i = 0; i < 4; ++i) {
        //allocate 128B per string
        str[i] =(char*) malloc(128 * sizeof(char)); 
        //here you should check if malloc was succesfull 
        //if malloc failed you schould free previously allocated memory
    }
    char c[2];
    for (int i = 0; i < 4; i++)
        scanf("%s", str[i]);
    int find = 0;
    while (find <= 2 && *str[0] != '\0' && *str[1] != '\0') {
        if (isalpha(*str[0]) && *str[0] == *str[1]
            && *str[0] - 'A' >= 0 && *str[0] - 'A' <= 25) {
            find++;
            if (find == 1)
                c[0] = *str[0];
            else if (find == 2)
                c[1] = *str[0];
        }
        str[0]++;
        str[1]++;
    }
    //delete memory
    for (int i =0; i < 4; ++i) {
        free(str[i]);
    }
   /* ... */
}
...