【问题标题】:Bad memory access while calling function调用函数时内存访问错误
【发布时间】:2014-04-24 04:58:24
【问题描述】:

实际上我使用单元测试进行开发。 但是我以其他形式分解我的代码以询问我遇到的错误。

我的header 文件中有这些声明

typedef struct
{
    void *topOfStack;

}Stack;



typedef enum {NUMBER,OPERATOR,IDENTIFIER}Token;

int operatorEvaluate(Stack *numberStack , Stack *operatorStack);
void * pop(Stack *stack);

以下是各自的source文件

#include "try.h"

void *pop(Stack *numberStack)
{
    Token *newToken = NUMBER;

    return newToken;

}


int operatorEvaluate(Stack *numberStack , Stack *operatorStack)
{
    Token *first = (Token*)pop (numberStack);
    if(numberStack != operatorStack)
    {
        if(*first == NUMBER)
            return 1;
    }
    return 0;
}

这是我调用函数的源文件main

#include "try.h"
#include <stdio.h>

int main ()
{
    Stack numberStack;
    Stack operatorStack;
    int num;
    num = operatorEvaluate(&numberStack , &operatorStack);
    printf("This is the returned value:  %d",num);
    return 0;
}

当我尝试编译时,单元测试告诉我内存访问错误。 所以我尝试使用eclipse来编译这些,windows告诉.exe已经停止工作。 希望有人可以帮助我,我卡了很长时间......

【问题讨论】:

    标签: c function pointers memory runtime-error


    【解决方案1】:

    您的pop 函数在某些方面是错误的。您可能希望它实际弹出您的堆栈,而不是返回一个常量(顺便说一句,它也没有这样做!)......像这样:

    void *pop(Stack *numberStack)
    {
        return numberStack->topOfStack;
    }
    

    但如果你这样做,它仍然会崩溃,因为你从来没有初始化你的堆栈填充topOfStack指针。

    【讨论】:

    • 是的,没错。但是,即使逻辑不正确,程序仍然可以运行。现在我的问题是程序中途停止工作。
    【解决方案2】:

    pop() 函数没有接触堆栈,而是返回一个转换为指针的枚举。如果您尝试通过该指针访问任何内容,则会引发未定义的行为。

    【讨论】:

      【解决方案3】:

      启用编译器警告。

      特别是,这是零意义:

      Token *newToken = NUMBER;
      

      这是一个指针,你正在分配一个

      我无法提出解决方案,因为我不知道你在做什么。

      【讨论】:

      • 抱歉让您感到困惑,因为我试图缩短这个时间。我明白你的意思,正在考虑其他方法来克服这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多