операции над STACK массива символов - PullRequest
0 голосов
/ 26 декабря 2018

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

Трассировка GDB: чтение символов из решения ... сделано.[Новый LWP 17326] Ядро было сгенерировано «решением».Программа прервана с сигналом SIGSEGV, ошибка сегментации.

0 __strcat_sse2_unaligned ()

at ../sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S:46

0 __strcat_sse2_unaligned ()

at ../sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S:46

1 0x000055de73frc9s в str1012 * __dest=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:128 2 добавление (w =, sptr = 0x55de7530c260)

at solution.c:31

3 0x000055de73f49808 в main () в решении .c: 90

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

typedef struct stack
{
    char** stk;
    int top;
}STACK;

void pop(STACK* s)
{
    s -> top--; 
}

char* peek(STACK* sptr)
{
    char* x = sptr -> stk[sptr -> top]; 
    return x;
}

void push(char* w, STACK* sptr)
{
    sptr -> stk[++sptr -> top] = w; 
}

void append(char* w, STACK* sptr)
{
    char* s1 = peek(sptr);
    strcat(s1, w);
    push(s1, sptr);

}

void del(int k, STACK* sptr)
{
    char* s = peek(sptr);
    char* s1;

    for(int i = 0; i < strlen(s) - k; ++i)
    {
        s1[i] = s[i];
    }

    push(s1, sptr);
}

void undo(STACK* sptr)
{
    pop(sptr);
}

char print(int k, STACK* sptr)
{
    char* s = peek(sptr);
    return s[k - 1];
}


int main()
{

    int times;
    int fn;
    char s[21];
    int k;
    STACK* sptr = (STACK*)malloc(sizeof(STACK));
    sptr -> stk = (char**)malloc(100 * sizeof(char*));


    // 1 append string s to existing
    // 2 delete last k chars
    // 3 print kth character of string
    // 4 undo

    // input times
    scanf("%d", &times);

    for(int i = 0; i < times; ++i)
    {
        // enter function number
        scanf("%d", &fn);

        switch(fn)
        {
            case 1: // take string

                    scanf("%s", s);
                    append(s, sptr);
                    break;

            case 2: // take k int

                    scanf("%d", &k);
                    del(k, sptr);
                    break;

            case 3: // k int

                    scanf("%d", &k);
                    char k = print(k, sptr);
                    printf("%c", k);
                    break;

            case 4: // just call pop
                    pop(sptr);
                    break;
        }
    }


    return 0;
}

edit 1: изменил char * s на char s [21], как указал @Sourav Ghosh.

, но получил другую ошибку, как показано ниже .......: /

Процесс 35026 остановлен * поток # 1, очередь = 'com.apple.main-thread', причина остановки = EXC_BAD_ACCESS (код = 1, адрес = 0x0) кадр № 0: 0x0000000100000c57 a.out`peek (sptr = 0x0000000100100320) в undo.c: 19 16 17 char * peek (STACK * sptr) 18 {-> 19 return sptr -> stk [sptr -> top]; 20} 21 22 void push (char * w, STACK *)sptr) Цель 0: (a.out) остановлена. (lldb)

1 Ответ

0 голосов
/ 26 декабря 2018

Проблема в том, что в вашем коде

 scanf("%s", s);

s не указывает на допустимую память.Это локальная переменная (указатель) с длительностью автоматического хранения, которая не инициализируется явно, поэтому она содержит неопределенное значение, которое является недопустимым адресом в контексте вашей программы.

Попытка доступа к этой недопустимой памяти вызывает неопределенное поведение .

Вам необходимо либо

  • сделать s указанием на действительную память (вы можете использовать функции распределителя, такие как malloc() и семейство)
  • сделать s массивом с предварительно определенной длиной и длиной, ограничивающей ваш ввод (гораздо предпочтительнее, ИМХО).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...