簡體   English   中英

C中函數的返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM