C中函数的返回值

时间:2016-12-18 09:21:44

标签: c stack return return-value return-type

我尝试编写一些代码来检查表达式中的paranthesis是否使用以下函数进行平衡。有人可以帮助我理解为什么下面的函数在表达平衡的情况下返回1,而在任何地方都没有指定返回1。

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

struct Stack
{
    int top;
    unsigned capacity;
    char* array;
};

struct Stack* createStack (unsigned capacity)
{
    struct Stack* stack = (struct Stack*) malloc (sizeof(struct Stack));
    if(!stack)
        return NULL;

stack->top = -1;
stack->capacity = capacity;
stack->array = (char*) malloc(stack->capacity * sizeof(int));

if (!stack->array)
    return NULL;
return stack;
}

int isEmpty(struct Stack* stack)
{
    return (stack->top == -1);
}
void push(struct Stack* stack, char op)
{
    stack->top++;
    stack->array[stack->top] = op;

}

int pop(struct Stack* stack)
{

    if (!isEmpty(stack))
        return (stack->array[stack->top--]);
    return '$';
}

int isMatchingPair(char char1 , char char2)
{
    if (char1 == '(' && char2 == ')')
        return 1;
    else if (char1 == '[' && char2 == ']')
        return 1;
    else if (char1 == '{' && char2 == '}')
        return 1;
    else
        return 0;
}

int paranthesesMatch(char* exp)
{
    int i;
    struct Stack* stack = createStack(strlen(exp));
    for(i = 0; exp[i]; i++)
    {
        if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
        push(stack , exp[i]);
       if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}')
       {
        if (stack == NULL)
            return 0;
        else if ( !isMatchingPair(pop(stack), exp[i]) )
           return 0;

       }
    }
}

int main()
{
  char exp[100] = "{()}[)";
  printf(" %d\n", paranthesesMatch(exp));
  if (paranthesesMatch(exp) == 1)
    printf("Balanced \n");
  else
    printf("Not Balanced \n");  
   return 0;
}  

编辑:添加完整代码。

3 个答案:

答案 0 :(得分:5)

返回1的函数是未定义行为的结果。编译器可以随意做任何事情,因为并非函数中的所有执行路径都会产生一个return语句。

可能似乎有效的原因是调用者(不知道函数在没有return语句的情况下完成)尝试访问返回的值(可能在指定的寄存器中) 。并且您的函数在返回调用者之前修改了所述寄存器。

在构建时提高警告级别,将对其进行诊断(like so)。您应该考虑将该特定警告提升为错误,因为省略return语句会导致险恶且难以发现错误。

答案 1 :(得分:2)

  

为什么下面的函数在表达式平衡的情况下返回1,而在任何地方都没有指定返回1。

您的函数具有完全不返回值的代码分支。具体来说,当循环到达结尾时,您的函数不会指定要返回的内容。在使用函数的情况下,返回值是未定义的行为:无论函数出现什么,&#34;返回&#34;是一个垃圾剩余值,在不同的计算机上可能会有所不同,甚至在多次运行程序时也可能在同一台计算机上。

就函数本身而言,堆栈的NULL检查可能是不正确的,除非代码在空的情况下删除stack(这将是一个相当糟糕的决定)。此外,代码有内存泄漏,因为stack永远不会被释放。它还将stack->array内容过度分配sizeof(int)(这些天在许多计算机上为4):

stack->array = (char*) malloc(stack->capacity * sizeof(int));

应该是

stack->array = malloc(stack->capacity);

因为你创建了一堆char s,而不是int的堆栈。

最后,无需动态分配stack。分配一个char的数组,并创建一个&#34;堆栈指针&#34;或堆栈索引指向堆栈的开头。将元素推送/弹出到堆栈时递增和递减指针/索引。如果使用可变长度数组,则不需要清理动态分配的内存。

答案 2 :(得分:0)

啊作为参考这个记得这个.. 流出函数末尾与没有表达式的返回相同。在任何一种情况下,返回值都是未定义的。