Khi bạn in chuỗi chúng tôi cần địa chỉ bắt đầu của chuỗi.
printf("%s\n", ptr);
^address with %s
nó in ký tự cho đến khi \0
gặp gỡ.
Trong khi in trò chuyện int .. chúng ta cần giá trị biến:
printf("%c\n", *ptr);
^* with %c print first char
đâu như trong scanf()
một chuỗi bạn luôn cần phải cung cấp địa chỉ:
scanf("%s", ptr);
^string address
Cũng cho int scanf()
một char
scanf("%c", ptr);
^read at first location char address
Lưu ý:Scanf()
cần giải quyết với %c
để lưu trữ một giá trị quét trong bộ nhớ.
Be cẩn thậnptr
trỏ đến chuỗi không đổi để bạn không thể sử dụng trong scanf.
Tại sao Lỗi phân đoạn bằng mã sau?
printf("%s\n", *ptr);
Khi bạn làm như thế này, vì %s
diễn giải printf *ptr
như địa chỉ, nhưng nó thực sự không phải là một địa chỉ và nếu bạn đối xử với nó như là địa chỉ nó chỉ ra một số vị trí đó được đọc bảo vệ cho chương trình của bạn (quá trình) Vì vậy, nó gây ra một lỗi phân đoạn.
bạn ptr
qua name
điểm đối với một số chuỗi liên tục trong bộ nhớ ("Jordan") như trong sơ đồ dưới đây:
name 2002
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 'J' │ 'o' │ 'r' │ 'd' │ 'a' │ 'n' │'\0' │ ........
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^
|
ptr = name
==> ptr = 2002
*ptr = 'J'
Trong printf("%s\n", *ptr);
giá trị *ptr = 'J'
và ASCII của char 'J' được 74
nhưng 74
địa chỉ là không dưới sự kiểm soát quá trình của bạn và bạn đang cố gắng đọc từ vị trí bộ nhớ đó và một lỗi bộ nhớ và lỗi phân đoạn xảy ra.
Nếu bạn biên dịch bạn mã chứa printf("%s\n", *ptr);
sau đó với tùy chọn thích hợp nói -Wall
với GCC
bạn sẽ nhận được một cảnh báo như dưới đây:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’
Says %s
nhu cầu (dự đoán) một địa chỉ của kiểu char*
nhưng bạn đặt giá trị
thông báo:
printf("%s\n", *ptr);
^ ^argument-2
argument-1