我收到以下程序的运行时错误,这很容易解释(首先请参阅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
在strcat中的1 0x000055de73f4999a(__src =,
__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在solution(.c:90)的main()中
#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;
}
编辑1:将char * s更改为char s [21];正如@Sourav指出的
ho
但是出现如下另一个错误.......:/
过程35026已停止
*线程#1,队列='com.apple.main-thread',停止原因= EXC_BAD_ACCESS(代码= 1,地址= 0x0)
第0帧:0x0000000100000c57 a.out`peek(sptr = 0x0000000100100320)撤消。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)
最佳答案
问题是,在您的代码中
scanf("%s", s);
s
不会指向任何有效的内存。它是具有自动存储持续时间的局部变量(指针),并且未显式初始化,因此具有不确定的值,该值在程序上下文中为无效地址。尝试访问该无效内存将调用undefined behavior。
你需要
使
s
指向有效内存(可以使用诸如malloc()
和family之类的分配器函数)将
s
设置为具有预定义长度的数组,并且长度限制您的输入(更可取的是IMHO)。