繁体   English   中英

字符数组的堆栈上的操作

[英]operations on STACK of array of characters

我收到以下程序的运行时错误,这很容易解释(首先请参阅main())

GDB跟踪:从解决方案中读取符号...完成。 [New 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 Ghosh所指出的。

但是出现如下另一个错误.......:/

进程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没有指向任何有效的内存。 它是一个具有自动存储持续时间的局部变量(指针),并且未显式初始化,因此具有不确定的值,该值在程序上下文中为无效地址。

尝试访问该无效内存会调用未定义的行为

你需要

  • 使s指向有效的内存(可以使用诸如malloc()和family之类的分配器函数)
  • 使s具有预定义的长度的数组,并且长度限制您的输入(更可取的是IMHO)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM