[英]Return value of a function in C
我尝试编写一些代码来检查表达式中的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;
}
编辑:添加完整代码。
返回1
函数是未定义行为的结果。 编译器可以随心所欲地执行任何操作,因为并非函数中的所有执行路径都会产生return语句。
它可能会出现工作的原因是调用者(也就是不知道该函数没有return语句结束),尝试访问返回值(这可能是在指定的寄存器)。 并且您的函数在返回调用者之前修改了所述寄存器。
在构建时提高警告级别将产生关于它的诊断( 如此 )。 您应该考虑将该特定警告提升为错误,因为省略return语句可能导致险恶且难以发现错误。
为什么下面的函数在平衡表达式的情况下返回1,当没有指定返回1时。
您的函数具有完全不返回值的代码分支。 具体来说,当循环到达结尾时,您的函数不会指定要返回的内容。 在使用函数的情况下,返回值是未定义的行为:无论函数出现什么,“返回”都是一个垃圾剩余值,在不同的计算机上可能会有所不同,甚至在多次运行程序时也可能在同一台计算机上。
就函数本身而言,堆栈的NULL
检查可能是不正确的,除非代码在它为空时删除stack
(这将是一个相当糟糕的决定)。 此外,代码有内存泄漏,因为stack
永远不会被释放。 它还以一个sizeof(int)
因子过度分配stack->array
内容(这些天在许多计算机上为4):
stack->array = (char*) malloc(stack->capacity * sizeof(int));
应该
stack->array = malloc(stack->capacity);
因为你创建了一堆char
,而不是一堆int
。
最后,不需要动态分配stack
。 分配一个char
数组,并使“堆栈指针”或堆栈索引指向堆栈的开头。 将元素推送/弹出到堆栈时递增和递减指针/索引。 如果使用可变长度数组,则无需清理动态分配的内存。
啊,作为对此的参考,请记住这一点。函数结束时的流程与没有表达式的返回相同。 在任何一种情况下,返回值都是未定义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.