我收到以下程序的运行时错误,这很容易解释(首先请参阅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", &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;
}



  编辑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)。

09-25 20:18