首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于结构的C-分段故障

基于结构的C-分段故障
EN

Stack Overflow用户
提问于 2015-03-31 18:29:58
回答 4查看 3.6K关注 0票数 2

如果这是个很容易解决的问题,我真的很抱歉,但我是个初学者。我有个任务要写一些函数到堆栈结构。结构是给出的。我无法排除push()行“s->元素”中的分段错误.我不知道在搜索和搜索几个小时后有什么问题。

在这里,代码:

代码语言:javascript
复制
#define STACK_SIZE 5

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

typedef struct stackADT {
    int elements[STACK_SIZE];
    int count;
} stack;

void initialize(stack *s)
{
     stack *newStack;
     newStack = malloc(sizeof(*newStack));
     newStack->count = 0;

     s = newStack;
}

int push(stack *s, int value)
{
    if(s->count == 5) return -1;
    else {
        s->elements[s->count++] = value;
        return s->elements[s->count-1];
    }
}

int main()
{
    stack* sA;
    stack* sB;
    initialize(sA);
    initialize(sB);
    printf("%d\n",push(sA,3));
    return 0;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-31 18:53:17

我认为你需要以下几点

代码语言:javascript
复制
#include <stdio.h>

#define STACK_SIZE  5

typedef struct stackADT 
{
    int elements[STACK_SIZE];
    int count;
} stack;

void initialize( stack *s )
{
    s->count = 0;
}

int push( stack *s, int value )
{
    return s->count == STACK_SIZE ? -1 : ( s->elements[s->count++] = value );
}

int main(void) 
{
    stack sA;
    stack sB;

    initialize( &sA );
    initialize( &sB );

    printf( "%d\n", push( &sA, 3 ) );

    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2015-03-31 18:35:05

因为您是通过值传递两个指针(因此实际上是传递指针的副本),所以将初始化函数更改为int initilize(stack **s),将s = newStack;更改为*s = newStack;,然后像下面的initialize(&sA); initialize(&sB);那样调用initialize(&sA); initialize(&sB);

您真的不应该动态地分配对象,除非您必须这样做,而且您也不应该对所分配的内存进行free(),这是内存泄漏。

票数 2
EN

Stack Overflow用户

发布于 2015-03-31 18:42:52

将指针传递给函数时,该函数将接收指针的副本。这通常是很好的,除非您正在更改/创建指针的开始地址

在您的示例中,sAsB不包含任何地址(当您将它们传递给initialize时,它们是指向任何内容的指针)。因此,您的initialize函数必须使用指针的地址,而不是指针本身的,才能为将在main中可见的指针分配一个地址。例如:

代码语言:javascript
复制
void initialize(stack **s)
{
    stack *newStack;
    newStack = malloc(sizeof(*newStack));
    newStack->count = 0;

    *s = newStack;
}

...

initialize (&sA);

删除上面的双指针**s (例如*s = newStack;),将newStack的地址指定为指针s的值。

我还建议在将newStack的位置分配给*s之前检查分配是否成功。

代码语言:javascript
复制
void initialize(stack **s)
{
    stack *newStack;
    if (!(newStack = malloc(sizeof(*newStack)))) {
        fprintf (stderr, "%s() error: memory allocation failed.\n", __func__);
        exit (EXIT_FAILURE);
    }
    newStack->count = 0;

    *s = newStack;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29375859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档