Tôi muốn xác định một chuỗi chuỗi C đa chiều, được khởi tạo bởi một số chuỗi ký tự. Trong C tôi sẽ làm như sau:
#include <stdio.h>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Tổng hợp gcc -std=c18 -pedantic test.c
và thực hiện các kết quả trong:
$ ./a.out
0x55d95410f004 0x55d95410f008
Như tôi mong đợi, chuỗi ký tự trống strArr[1][0]
sẽ phân rã thành một con trỏ hợp lệ.
Tuy nhiên, khi tôi thử mã tương tự trong C ++ :
#include <cstdio>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Tổng hợp g++ -std=c++17 -pedantic test.cpp
và thực hiện các kết quả trong:
$ ./a.out
0x55c61494d004 (nil)
Ở đây, chuỗi ký tự trống trong strArr[1][0]
phân rã thành một con trỏ null. Tại sao điều này xảy ra trong C ++?
Trong tiêu chuẩn C ++ 17, tôi thấy như sau trong 5.13.5 đoạn 16 :
Các chuỗi ký tự thông thường và các chuỗi ký tự UTF-8 cũng được gọi là các chuỗi ký tự hẹp. Một chuỗi ký tự hẹp có kiểu mảng kiểu của n const char, trong đó n là kích thước của chuỗi như được định nghĩa dưới đây và có thời lượng lưu trữ tĩnh (6.7).
Điều này dường như cho thấy rằng một chuỗi ký tự trống, là một chuỗi ký tự thông thường, nên có thời lượng lưu trữ tĩnh. Vậy tại sao một chuỗi rỗng sẽ phân rã thành một con trỏ null?
std::array
?