2011-11-09 29 views
8

Khi đọc this question Tôi muốn kiểm tra đầu vào trong GCC để xem lỗi nào sẽ xuất ra. Để tôi ngạc nhiên dòng sau:Trong C, là khởi tạo mảng chỉ với một phần tử được xử lý đặc biệt?

char array[] = {"s"}; 

biên dịch không có lỗi hoặc cảnh báo, dẫn đến một mảng có kích thước 2 chứa "s\0". Tôi đã mong đợi một lỗi trình biên dịch vì bên phải của biểu thức là loại char*[].

Là khởi tạo mảng chỉ với một phần tử không được coi là một mảng trong trường hợp này và tại sao?

Trả lời

6
char array[] = {"s"}; 

là giống như:

char array[] = "s"; 

Đây { } là không bắt buộc trong trường hợp này vì "s" là chuỗi chữ.

Hoặc,

char array[] = {'s', '\0'}; 

Trong trường hợp này, { } là cần thiết để khởi tạo mảng.

+4

đặc biệt trong C, bạn thực sự có thể khởi tạo vô hướng sử dụng {} ... Tuy nhiên, tôi tự hỏi liệu nó có ảnh hưởng đến căn chỉnh hay không. Không .. không ảnh hưởng đến căn chỉnh :) –

+0

OK. Vì vậy, tôi phải xem xét toàn bộ biểu hiện trong trường hợp này, và không chỉ ở phía bên trái?'{" s "}' chắc chắn không giống với '' s "', ví dụ 'char array * [] = {" s "};' là hợp lệ nhưng 'char array * [] =" s ";' không phải là. – Antoine

+0

mảng char * [] = {"s"}; có hiệu lực? nó là một lỗi cú pháp –

-10

một chuỗi khởi tạo một cách chính xác là:

char array[] = "something"; 

nó một mảng 10 char.

nhưng nếu bạn viết:

`char* array = "something";` 

'nó là một đối tượng khác nhau, bạn sẽ không thể sửa đổi nội dung của mảng.

và:

char* array[] 

không phải là một chuỗi.

nó là một mảng con trỏ char (char *). bạn cần phải phân bổ bộ nhớ cho mỗi char *

exp:

char* array[3]; 
array[0] = malloc (10*sizeof(char)); 
strcpy(array[0] , "hello"); 

nhưng, để có một mảng của char *, bạn không thể làm trực tiếp:

char* array[3]; 
array[0] = "hello"; 

neither

char* array[] = {"first","second","other one","last"}; 

với init này, không thể sửa đổi chuỗi.

cho những người nói những gì tôi viết là sai hoàn toàn, bạn có biết rằng char * cần phân bổ bộ nhớ không?

vậy tại sao -6 trở lên?

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