CẢNH 1
int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
Tại sao điều này lại mặc định?
Bạn đã khai báo nums
là một con trỏ tới int - nums
được cho là giữ địa chỉ của một số nguyên trong bộ nhớ.
Sau đó, bạn đã cố gắng khởi tạo nums
thành một mảng nhiều giá trị. Vì vậy, nếu không đi sâu vào chi tiết, điều này là không chính xác về mặt khái niệm - không có ý nghĩa gì khi gán nhiều giá trị cho một biến được cho là chứa một giá trị. Về vấn đề này, bạn sẽ thấy chính xác hiệu quả tương tự nếu bạn làm điều này:
int nums = {5, 2, 1, 4};
printf("%d\n", nums);
Trong cả hai trường hợp (gán nhiều giá trị cho một con trỏ hoặc một biến int), điều xảy ra sau đó là biến sẽ nhận giá trị đầu tiên 5
, trong khi các giá trị còn lại bị bỏ qua. Mã này tuân thủ nhưng bạn sẽ nhận được cảnh báo cho từng giá trị bổ sung không được phép có trong nhiệm vụ:
warning: excess elements in scalar initializer
.
Đối với trường hợp gán nhiều giá trị cho biến con trỏ, chương trình sẽ mặc định khi bạn truy cập nums[0]
, có nghĩa là bạn đang tham chiếu đến bất cứ thứ gì được lưu trữ trong địa chỉ 5 theo nghĩa đen. Bạn đã không cấp phát bất kỳ bộ nhớ hợp lệ nào cho con trỏ nums
trong trường hợp này.
Cần lưu ý rằng không có mặc định nào cho trường hợp gán nhiều giá trị cho biến int (bạn không tham chiếu đến bất kỳ con trỏ không hợp lệ nào ở đây).
KỊCH BẢN 2
int nums[] = {5, 2, 1, 4};
Điều này không mặc định, bởi vì bạn đang phân bổ hợp pháp một mảng 4 int trong ngăn xếp.
KỊCH BẢN 3
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
Điều này không mặc định như mong đợi, bởi vì bạn đang in giá trị của chính con trỏ - KHÔNG phải thứ mà nó đang tham chiếu (là truy cập bộ nhớ không hợp lệ).
Khác
Nó hầu như luôn phải chịu đựng segfault bất cứ khi nào bạn mã hóa giá trị của một con trỏ như thế này (bởi vì nhiệm vụ của hệ điều hành là xác định quá trình nào có thể truy cập vị trí bộ nhớ nào).
int *nums = 5;
Vì vậy, một quy tắc chung là luôn khởi tạo một con trỏ đến địa chỉ của một số biến được phân bổ , chẳng hạn như:
int a;
int *nums = &a;
hoặc là,
int a[] = {5, 2, 1, 4};
int *nums = a;