2016-04-05 25 views
10

Tôi đã đi qua một đoạn mã làm cho khởi tạo sau:Chuỗi initializer với dấu ngoặc nhọn

static const uint8_t s[] = {"Some string"}; 

Tôi mong chờ nó được hiểu như sau: Phía bên phải là phù hợp với một mảng của con trỏ char với single phần tử trỏ đến chuỗi ký tự "Một số chuỗi". Trong khi phần bên trái là một mảng của uint8_t. Sau đó, hành vi tôi mong đợi là phần tử đầu tiên của s để nhận một số giá trị cắt ngắn của con trỏ đến chuỗi ký tự, do đó gây ra hành vi không mong muốn trong mã sau, giả sử s là một chuỗi.

tôi đã thực hiện các mã kiểm tra sau đây:

#include <stdint.h> 
#include <stdio.h> 

static const uint8_t s1[] = "String1"; 
static const uint8_t s2[] = { "String2" }; 
int main(void){ 

    printf("%p, %p\n", s1, s2); 
    printf("%s, %s\n", s1, s2); 

    return 0; 
} 

Đối với sự ngạc nhiên của tôi có vẻ như nó không phải đang xảy ra. Không chỉ mã sẽ hoạt động chính xác, mà còn việc tháo gỡ cho thấy cả hai s1s2 được khởi tạo như các chuỗi tương ứng theo cách giống hệt nhau.

Đây có phải là điều gì đó gcc cụ thể không? Cú pháp C có cho phép lấy một chuỗi ký tự thành {} và vẫn diễn giải nó dưới dạng chuỗi ký tự không?

+0

Thêm chuỗi thứ hai và xem điều gì xảy ra: 'static const uint8_t s2 [] = {" String2 "," String3 "};' – LPs

+0

@LPs Vâng, đã thử. –

+0

Ok, DevSolar đã cho bạn những gì bạn cần. – LPs

Trả lời

16

Quoted from N1570 (dự thảo cuối cùng của C11), 6.7.9 Khởi tạo (tôi nhấn mạnh):

  1. Một mảng của kiểu nhân vật có thể được khởi tạo bởi một nhân vật chuỗi chữ hoặc UTF-8 chuỗi chữ, tùy chọn đính kèm trong niềng răng. byte kế tiếp của chuỗi ký tự (bao gồm cả ký tự kết thúc null nếu có chỗ hoặc nếu mảng có kích thước không xác định) khởi tạo các phần tử của mảng.
+2

Ok, điều này sẽ trả lời câu hỏi một cách rõ ràng. Cảm ơn bạn. –

8

Câu trả lời của Sun qingyao đề cập chính xác rằng bạn có thể thêm dấu ngoặc phụ vào bộ khởi tạo như vậy. Đó là giá trị đề cập đến điều này không chỉ áp dụng cho các mảng:

int x = { 0 }; 

compiles mặc dù các phần tử được khởi tạo không phải là một mảng. Điều này là nhờ các điều khoản sau đây:

6.7.9.11 Trình khởi tạo cho vô hướng phải là một biểu thức duy nhất, được tùy ý đính kèm trong niềng răng.

Nhưng tại sao điều đó lại được phép? Câu trả lời là, điều này làm cho khả năng khởi tạo giá trị với một cú pháp duy nhất:

T x = { 0 }; 

công trình đối với bất kỳ T và zero-khởi tất cả mọi thứ (đối với cấu trúc, mỗi thành viên đối với mảng, mỗi phần tử, với nhiều loại vô hướng, chỉ cần khởi giá trị).

+1

Bạn có thể thêm tham chiếu: '11 Trình khởi tạo cho vô hướng phải là một biểu thức duy nhất, được tùy ý đính kèm trong dấu ngoặc ôm. ' –

+0

@sun qingyao Tôi nghĩ rằng tham chiếu đó sẽ đủ điều kiện làm câu trả lời đầy đủ. Mặc dù về mặt kỹ thuật, thực thể khởi tạo không phải là vô hướng .... –

Các vấn đề liên quan