Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ความแตกต่างระหว่าง char s[] และ char *s ในภาษา C

สตริงใน C สามารถประกาศได้ทั้ง char s[] และ char *s แล้วทั้งคู่ต่างกันอย่างไร?

มีความแตกต่างสำคัญดังนี้:

  • s[] เป็นอาร์เรย์ ส่วน *s เป็นพอยน์เตอร์
  • ถ้า char s[20] และ char *s ใช้ sizeof() จะได้ 20 และ 4 ตามลำดับ (ขนาดพอยน์เตอร์)
  • อาร์เรย์: สตริงทั้งหมดเก็บใน Stack
  • พอยน์เตอร์: ตัวแปรพอยน์เตอร์เก็บใน Stack แต่เนื้อหาสตริงเก็บใน Code Section (Read-only)
  • สำคัญที่สุด: ไม่สามารถแก้ไขสตริงแบบพอยน์เตอร์ได้ (Segmentation Fault) แต่แบบอาร์เรย์แก้ไขได้

ตัวอย่าง: char s[] (แก้ไขได้)

#include <stdio.h>

int main() {
    char s[] = "Hello World";
    s[6] = 'x'; // พยายามแก้ไขตัวอักษรตำแหน่งที่ 6
    printf("%s", s);
    return 0;
}

ผลลัพธ์

Hello xorld

ตัวอย่าง: char *s (แก้ไขไม่ได้)

#include <stdio.h>

int main() {
    char *s = "Hello World";
    s[6] = 'x'; // พยายามแก้ไข -> Segmentation Fault
    printf("%s", s);
    return 0;
}

ผลลัพธ์

Segmentation Fault