Bạn chưa khởi tạo pass
để trỏ đến bộ đệm hoặc vị trí khác để lưu trữ đầu vào.
Đối với một cái gì đó đơn giản như thế này, bạn có thể khai pass
như một mảng của char
thay vì một con trỏ:
char pass[N]; // where N is large enough to hold the password plus a 0 terminator
scanf("%s", pass);
if (strcmp(pass, "acopio") == 0)
{
...
}
Trừ khi nó là toán hạng của sizeof
, _Alignof
, hoặc unary &
nhà khai thác, hoặc là một chuỗi ký tự được sử dụng để khởi tạo mảng khác trong khai báo, biểu thức thuộc loại "phần tử N số T
" sẽ được chuyển đổi ("phân rã") thành biểu thức loại "con trỏ đến T
" và giá trị của biểu thức sẽ là địa chỉ của yếu tố đầu tiên của mảng.
Khi bạn vượt qua pass
như một cuộc tranh cãi để scanf
và strcmp
, kiểu của biểu thức pass
được chuyển đổi từ "mảng N phần tử của char
" thành "con trỏ đến char
", và giá trị của biểu thức là địa chỉ của phần tử đầu tiên là pass
hoặc &pass[0]
.Đó là lý do tại sao bạn không cần sử dụng toán tử &
trong cuộc gọi scanf
.
Tương tự như vậy, trong strcmp
cuộc gọi, chuỗi chữ "acopio" được chuyển đổi từ một biểu hiện của "mảng phần tử 7 của char
" loại (const char
trong C++) để "con trỏ đến char
".
Nguồn
2012-11-06 15:01:08
Tại sao -1? Tôi đang học; cố gắng tìm câu trả lời ở đây; và đối với người mới bắt đầu, không dễ hiểu các câu trả lời khác. – jotape