Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Khác biệt giữa char s[] và char *s trong C

Đôi khi chuỗi được khai báo bằng char s[], đôi khi bằng char *s. Có khác biệt gì không?

Có sự khác biệt. s[] là mảng, còn *s là con trỏ. Ví dụ, nếu khai báo char s[20] và char *s, dùng sizeof() sẽ cho 20 và 4. Mảng cho 20 vì chiếm 20 byte. Con trỏ cho 4 vì đó là kích thước một biến con trỏ. Với mảng, toàn bộ chuỗi lưu ở ngăn xếp (stack); với con trỏ, biến con trỏ lưu ở stack, nội dung lưu ở đoạn mã (code section). Quan trọng nhất: không thể sửa đổi chuỗi kiểu con trỏ (chỉ đọc), nhưng có thể sửa chuỗi kiểu mảng.

Ví dụ 1: Mảng (có thể sửa)

#include <stdio.h>

int main() {
    char s[] = "Hello World";
    s[6] = 'x'; // thử sửa ký tự vị trí 6
    printf("%s", s);
    return 0;
}

Kết quả

Hello xorld
Sửa thành công.

Ví dụ 2: Con trỏ (chỉ đọc, gây lỗi)

#include <stdio.h>

int main() {
    char *s = "Hello World";
    s[6] = 'x'; // thử sửa ký tự vị trí 6
    printf("%s", s);
    return 0;
}

Kết quả

Segmentation Fault