Tại sao một chuỗi rỗng bằng chữ trong một mảng nhiều chiều phân rã thành một con trỏ null?


8

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.cvà 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.cppvà 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?


1
Tại sao sử dụng mảng kiểu C ở vị trí đầu tiên? Tại sao không std::array?
Jesper Juhl

2
@super một chuỗi rỗng có một ký tự: dấu kết thúc. Khi bạn in nó, nó sẽ không có gì hợp lệ.
Thời tiết

3
Đây có lẽ chỉ là một hồi quy GCC 9. Bạn nên báo cáo và xem những gì họ nói.
Brian

2
g ++ thực hiện điều này, clang không: gcc.godbolt.org/z/XkZcVy Trông giống như một lỗi g ++.
PSkocik

1
@KeithThndry Việc tạo tài khoản trên trang web bugzilla của GCC bị hạn chế, vì vậy tôi đã gửi một yêu cầu email hy vọng sẽ được hoàn thành vào ngày mai. Hiện tại, tôi đã mở một báo cáo lỗi về Gentoo: bug.gentoo.org/701364
Gray

Câu trả lời:


2

Hành vi này không đúng và trong trường hợp này là kết quả của hồi quy trong GCC : https://gcc.gnu.org/PR90947

Hồi quy đã được sửa cho phiên bản GCC 9.3 và hy vọng sẽ làm cho nó trở lại các phiên bản trước đó cũng bị ảnh hưởng.


0

Không có sự phân rã như vậy; đầu ra bạn quan sát là một lỗi biên dịch.

(Có, đây là một câu trả lời ngắn nhưng không có gì khác để thêm vào).


Từ các nhận xét về câu hỏi, đó là một hồi quy trong g ++ 9, được báo cáo trên Gentoo: bug.gentoo.org/701364
Keith Thompson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.