C 庫 - va_end() 宏



C 的stdargva_end() 宏用於執行對由va_start 或 va_copy 初始化的ap 物件(型別為 va_list 的變數)的清理。它可能會修改 ap,使其不再可用。

在使用使用va_start 或“va_copy”的函式之後,應呼叫va_end。它不能在沒有相應的“va_start”或“va_copy”的情況下呼叫。這樣做會導致未定義的行為。

此宏用於記憶體管理,並進一步防止記憶體洩漏。

語法

以下是 va_end() 宏的 C 庫語法:

void va_end(va_list ap)

引數

此宏接受單個引數:

  • ap - 這是一個 va_list 型別的變數,它將由“va_start”初始化。此變數用於遍歷引數列表。

返回值

此宏不返回值。

示例 1

以下是演示 va_end() 用法的基本 c 示例。

#include <stdio.h>
#include <stdarg.h>
int sum(int count, ...) {
   va_list args;
   int tot = 0;
   
   // Set the va_list variable with the last fixed argument
   va_start(args, count);
   
   // Retrieve the arguments and calculate the sum
   for (int i = 0; i < count; i++) {
      tot = tot + va_arg(args, int);
   }
   
   // use the va_end to clean va_list variable
   va_end(args);
   
   return tot;
}

int main() {
   // Call the sum, with number of arguments
   printf("Sum of 3, 5, 7, 9: %d\n", sum(4, 3, 5, 7, 9));
   printf("Sum of 1, 2, 3, 4, 5: %d\n", sum(5, 1, 2, 3, 4, 5));
   return 0;
}

輸出

以下是輸出:

Sum of 3, 5, 7, 9: 24
Sum of 1, 2, 3, 4, 5: 15

示例 2:計算引數個數

以下 c 示例演示了在可變引數函式中使用 va_end()

#include <stdio.h>
#include <stdarg.h>
int cnt(int count, ...) {
   va_list args;
   int num_of_arg = 0;

   // Set the va_list variable with the last fixed argument
   va_start(args, count);

   // Retrieve the arguments and count the arguments
   for (int i = 0; i < count; i++) {
      num_of_arg= num_of_arg + 1;
   }    
   // use the va_end to clean va_list variable
   va_end(args);

   return num_of_arg;
}

int main() {
   // Call the sum, with number of arguments
   printf("Number of arguments: %d\n", cnt(4, 3, 5, 7, 9));
   printf("Number of arguments: %d\n", cnt(5, 1, 2, 3, 4, 5));
   return 0;
}

輸出

以下是輸出:

Number of arguments: 4
Number of arguments: 5

示例 3:查詢最大數

讓我們看另一個例子,我們使用 va_end() 在找到最大數後清理 va_list 變數。

#include <stdarg.h>
#include <stdio.h>

int Largest_num(int n, ...) {
   va_list ap;
   va_start(ap, n);
   int max = va_arg(ap, int);
   for (int i = 0; i < n - 1; i++) {
      int temp = va_arg(ap, int);
      max = temp > max ? temp : max;
   }
   // use va_end to clean up va_list variable
   va_end(ap);
   return max;
}

int main() {
   printf("%d\n", Largest_num(2, 1, 2));
   printf("%d\n", Largest_num(3, 1, 2, 3));
   printf("%d\n", Largest_num(4, 6, 2, 3, 4));
   return 0;
}

輸出

以下是輸出:

2
3
6
廣告