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 s1
và s2
đượ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?
Thêm chuỗi thứ hai và xem điều gì xảy ra: 'static const uint8_t s2 [] = {" String2 "," String3 "};' – LPs
@LPs Vâng, đã thử. –
Ok, DevSolar đã cho bạn những gì bạn cần. – LPs