สตริงใน 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