Trước tiên, bạn nên kết thúc printfs bằng "\ n" (hoặc ít nhất là tệp cuối cùng). Nhưng điều đó không liên quan đến segfault.
Khi trình biên dịch biên dịch mã của bạn, nó chia phần nhị phân thành nhiều phần. Một số chỉ đọc, trong khi một số khác có thể ghi. Việc ghi vào phần chỉ đọc có thể gây ra sự phân đoạn. Chuỗi ký tự thường được đặt trong phần chỉ đọc (gcc nên đặt trong ".rodata"). Tên con trỏ trỏ tới phần ro đó. Do đó bạn phải sử dụng
const char *name = "Vikram";
Trong phản hồi của tôi, tôi đã sử dụng một vài "có thể" "nên". Hành vi này phụ thuộc vào hệ điều hành, trình biên dịch và cài đặt biên dịch của bạn (Kịch bản trình liên kết xác định các phần).
Thêm
-Wa,-ahlms=myfile.lst
vào dòng lệnh gcc của tạo ra một tập tin gọi là myfile.lst với mã lắp ráp tạo ra. Ở trên cùng, bạn có thể thấy
.section .rodata
.LC0:
.string "Vikram"
Điều này cho thấy chuỗi nằm trong Vikram.
Cùng mã sử dụng (Phải ở phạm vi toàn cầu, khác gcc có thể lưu trữ nó trên stack, thấy nó là một mảng và không phải là một con trỏ)
char name[] = "Vikram";
sản xuất
.data
.type name, @object
.size name, 7
name:
.string "Vikram"
Các cú pháp có một chút khác biệt nhưng xem cách nó nằm trong phần .data bây giờ, đó là đọc-ghi. Bằng cách này ví dụ hoạt động.
Tôi không chắc chắn lắm. Nó hoạt động như mong đợi trên mac của tôi chạy OSX Lion (tuân thủ LLVM, gỡ rối với LLDB). –