- Back to Home »
- Programming techniques »
- C/C++ Giá trị khởi tạo ban đầu của biến
Thursday, July 2, 2015
Giá trị khởi tạo ban đầu của biến tưởng chừng đơn giản nhưng nhiều khi để lại hậu quả nghiêm trọng, trong bài viết này đề cập đến một số trường hợp bạn phải khởi tạo giá trị bạn đầu cho biến một cách rõ ràng.
initial_value.c (vd chỉ có tính minh họa)
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int main(int argc, char **argv){
int idata; /* default: 0 */
bool bdata; /* default: false */
float *pdata; /* default: NULL */
if(!idata){
/* code here */
printf("goto here 1\n");
}
if(!bdata){
/* code here */
printf("goto here 2\n");
}
if(!pdata){
/* code here */
printf("goto here 3\n");
pdata = (float*)malloc(sizeof(float));
}
*pdata = 10;
free(pdata);
return 1;
}
Theo suy luận thông thường, khi khai báo mà không khởi tạo giá trị mặc định cụ thể cho biến thì chúng vẫn được tự động gắn các giá trị default như trên ví dụ trên, và vì vậy bạn thấy ngay các biểu trức if sẽ trả về kết quả là true.
Tuy nhiên trong thực tế (kinh nghiệm người viết bài này đã từng gặp phải) thì các giá trị thực sự mà các biến trên có được không giống như giá trị default đáng ra chúng phải bằng; có thể là idata != 0, bdata = true và pdata != NULL dẫn đến các logic của chương trình bị sai, hoặc chương trình bị crash (thao tác với con trỏ không hợp lệ).
Vì vậy khi gặp ngữ cảnh kiểu như trong vd trên thì tốt nhất bạn phải khởi tạo giá trị tường minh cho các biến:
int idata = 0;
bool bdata = false;
float *pdata = NULL;
Đặc biệt quan trọng trong lập trình C++, bạn nên khởi tạo giá trị cho tất cả các biến thuộc class trong hàm Constructor, và giải phóng bộ nhớ (nếu là con trỏ) trong hàm Destructor.