Я получаю ошибку времени выполнения для следующей программы, которая довольно понятна (сначала см. 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", ×);
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)