C Sandbox
C sandbox online — biên dịch và chạy C bằng GCC 10.2 trong trình duyệt. Chọn C89/C99/C11/C17, bật -Werror, thêm flag (-Wall -O2 -lm) và stdin. Không cài đặt.
C Sandbox - Chạy Code C Trực Tuyến Miễn Phí
C là ngôn ngữ phổ thông của lập trình hệ thống — kernel Linux, runtime của Python và Node.js, mọi firmware nhúng, mọi engine cơ sở dữ liệu, mọi ví tiền điện tử, và khoảng một nửa số trình thông dịch ngôn ngữ 'cấp cao' đều được viết bằng C. Tuy nhiên, cài đặt toolchain C cục bộ (cài GCC/Clang, cấu hình PATH, học cơ bản về Makefile) là bức tường đầu tiên mà mọi lập trình viên mới đụng phải. Sandbox này gỡ bức tường đó: dán đoạn mã, nhấn Chạy, và code của bạn được biên dịch và thực thi trên GCC 10.2.0 với hỗ trợ đầy đủ chuẩn C11 trong dưới một giây. Việc thực thi diễn ra phía server thông qua API Piston open-source (engineer-man/piston trên GitHub) trong container Docker cô lập không có truy cập mạng và giới hạn cứng 3 giây runtime (nên code không tin cậy không thể gây hại, và benchmark nặng có thể bị cắt). Bạn nhận được stdout của chương trình, mọi cảnh báo/lỗi biên dịch với số dòng, thời gian thực thi và exit code. Bộ chọn Chuẩn C (C89/ANSI, C99, C11, C17) và công tắc -Werror một chạm cho phép kiểm tra tính khả chuyển và tuân thủ, trong khi các tham số trình biên dịch tùy chỉnh (-Wall, -Wextra, -O0..-O3, -lm, -lpthread) cho phép thử nghiệm với mức tối ưu hóa và liên kết thư viện. Trường stdin cung cấp đầu vào chuẩn cho chương trình dùng scanf/getchar/fgets mà không cần viết lại. Sáu ví dụ khởi đầu được phân loại — Hello World, vòng lặp for, định nghĩa hàm, lặp mảng, dereference con trỏ, sử dụng struct — bao phủ cú pháp bạn sẽ thấy trong tuần đầu của bất kỳ khóa học C nào.
C Sandbox là gì?
C Sandbox là trình biên dịch C trực tuyến cho phép bạn chạy code C trực tiếp trong trình duyệt mà không cần cài đặt. Sử dụng Piston API và GCC compiler, nó cung cấp:
- Biên dịch và thực thi code tức thì
- Hỗ trợ thư viện chuẩn C
- Tùy chỉnh flags và arguments compiler
- Hỗ trợ standard input (stdin)
- Thông báo lỗi và thông tin debug
- Ví dụ code để học
Hoàn hảo cho sinh viên, lập trình viên và người học lập trình C.
Làm thế nào để sử dụng C Sandbox?
Sử dụng C Sandbox rất đơn giản:
1. Viết hoặc paste code C vào editor
2. (Tùy chọn) Thêm arguments compiler như -Wall -O2
3. (Tùy chọn) Cung cấp stdin input nếu chương trình cần
4. Nhấp 'Chạy Code' để biên dịch và thực thi
5. Xem output hoặc lỗi biên dịch
6. Thử các code mẫu để học C cơ bản
Bạn cũng có thể tải code về dưới dạng file .c để dùng sau.
C Sandbox hỗ trợ những tính năng gì?
Sandbox hỗ trợ đầy đủ tính năng ngôn ngữ C:
- Tất cả tính năng chuẩn C11
- Thư viện chuẩn (stdio.h, stdlib.h, string.h, math.h, v.v.)
- Cấp phát bộ nhớ động (malloc, calloc, free)
- Thao tác File I/O
- Con trỏ và số học con trỏ
- Cấu trúc và union
- Mảng và chuỗi
- Con trỏ hàm
- Preprocessor directives
Compiler: GCC 10.2.0 với hỗ trợ chuẩn C11.
Tôi có thể dùng compiler flags không?
Có! Bạn có thể thêm các arguments compiler tùy chỉnh trong trường 'Tham Số Compiler'. Ví dụ phổ biến:
- `-Wall` - Bật tất cả cảnh báo
- `-Wextra` - Bật thêm cảnh báo
- `-O2` - Mức tối ưu hóa 2
- `-std=c11` - Sử dụng chuẩn C11
- `-lm` - Liên kết thư viện math
- `-g` - Bao gồm debug symbols
Ví dụ: `-Wall -Wextra -O2 -std=c11`
Stdin input hoạt động như thế nào?
Nếu chương trình của bạn sử dụng scanf(), gets(), fgets(), hoặc các hàm input khác, bạn có thể cung cấp input trong trường 'Đầu Vào Chuẩn'.
Chương trình ví dụ:
```c
#include <stdio.h>
int main() {
int so;
scanf("%d", &so);
printf("Bạn nhập: %d\n", so);
return 0;
}
```
Trong trường stdin, nhập: `42`
Chương trình sẽ đọc giá trị này và xuất: `Bạn nhập: 42`

Tại sao chương trình malloc/free của tôi có vẻ bị rò rỉ bộ nhớ?
Có lẽ không bị — nhưng sandbox không thể xác nhận chắc chắn vì Valgrind không có sẵn phía server. Ảo giác rò rỉ trong môi trường này thường đến từ một trong ba nguyên nhân. (1) Bạn cấp phát bộ nhớ và quên free() trước khi chương trình thoát — về mặt nghiêm ngặt đây không phải rò rỉ, vì OS thu hồi toàn bộ bộ nhớ tiến trình khi thoát, nhưng vẫn là bug đáng quan tâm trong code chạy lâu. (2) Bạn nhầm 'bộ nhớ heap đã dùng' với 'bộ nhớ bị rò': cấp phát mảng một triệu int dùng ~4 MB hợp lệ. (3) free() của bạn nằm trong đường code không thể đến — ví dụ sau return sớm hoặc trong nhánh if không kích hoạt. Để kiểm tra offline, cài GCC cộng Valgrind cục bộ và chạy 'valgrind --leak-check=full ./yourprogram' — Valgrind báo cáo mọi malloc không có free tương ứng cùng dòng nguồn chính xác của cấp phát. Trình biên dịch hiện đại cũng hỗ trợ AddressSanitizer ('gcc -fsanitize=address') phát hiện rò rỉ tại runtime với overhead thấp hơn nhiều so với Valgrind.
Tại sao code của tôi bị crash với 'Segmentation fault'?
Segfault có nghĩa chương trình của bạn cố truy cập địa chỉ bộ nhớ mà nó không sở hữu. Năm nguyên nhân phổ biến nhất trong C cơ bản:
(1) Dereference con trỏ NULL: int *p = NULL; *p = 5; — crash. Luôn kiểm tra con trỏ trước khi dereference.
(2) Dereference con trỏ CHƯA KHỞI TẠO: int *p; *p = 5; — p chứa rác ngẫu nhiên từ stack mà gần như chắc chắn không phải địa chỉ hợp lệ.
(3) Buffer overflow: char buf[10]; strcpy(buf, "chuỗi này quá dài"); — ghi quá cuối mảng vào bộ nhớ stack lân cận.
(4) Use-after-free: int *p = malloc(4); free(p); *p = 5; — p vẫn giữ địa chỉ cũ nhưng bộ nhớ không còn là của bạn.
(5) Stack overflow do đệ quy vô hạn: int f(int n) { return f(n+1); } — main gọi f, f gọi f, cuối cùng call stack chạm giới hạn kích thước.
Sandbox in 'Segmentation fault (core dumped)' và exit code 139 (128+SIGSEGV) khi điều này xảy ra. Biên dịch với -g và dùng debugger cục bộ (gdb) hoặc AddressSanitizer để xác định dòng chính xác.
Tôi nên chọn chuẩn C nào (C89, C99, C11, C17)?
Dùng menu 'Chuẩn C' để biên dịch theo một phiên bản ngôn ngữ cụ thể — nó tự đặt -std= cho bạn. Hãy chọn theo mục tiêu, không phải theo 'mới nhất là tốt nhất':
- C89 (ANSI C): khả chuyển nhất. Nhiều toolchain nhúng và codebase cũ yêu cầu nó. C89 cấm comment // theo dòng, khai báo sau câu lệnh, và biến có phạm vi trong vòng for (for (int i...) là lỗi). Chọn C89 là cách nhanh nhất để kiểm tra code của bạn có thực sự khả chuyển không.
- C99: thêm comment //, khai báo trộn lẫn, designated initializer, mảng độ dài thay đổi, long long, stdint.h và bool qua stdbool.h. Một nền tảng hợp lý cho code hiện đại.
- C11: thêm _Static_assert, struct/union ẩn danh, _Generic và <threads.h>/<stdatomic.h> tùy chọn cho concurrency khả chuyển. Mặc định ở đây.
- C17 (còn gọi C18): không có tính năng mới — là C11 với các sửa lỗi khiếm khuyết. Chọn nó khi bạn muốn ngữ nghĩa C11 với các bản vá mới nhất.
Mẹo: bật -Werror và biên dịch dưới C89 để phơi bày mọi cấu trúc không khả chuyển thành lỗi cứng.
-O0 và -O3 khác nhau thế nào, và tại sao output có thể khác?
Các flag -O điều khiển mức tối ưu hóa, có thể thay đổi đáng kể code sinh ra (và đôi khi phơi bày bug):
- -O0 (mặc định nếu bạn không đặt gì): không tối ưu hóa. Biên dịch nhanh nhất, dễ debug nhất, biến nằm trong bộ nhớ. Tốt nhất khi đang phát triển.
- -O1 / -O2: ngày càng mạnh hơn — inlining, loại bỏ code chết, tối ưu vòng lặp, cấp phát thanh ghi. -O2 là cài đặt release thông thường.
- -O3: thêm inlining mạnh và vector hóa. Binary lớn hơn; không phải lúc nào cũng nhanh hơn.
- -Os / -Ofast: tối ưu cho kích thước / cho tốc độ thuần (nới lỏng toán học IEEE). Tránh -Ofast trừ khi bạn hiểu các đánh đổi về số thực dấu phẩy động.
Tại sao kết quả có thể khác giữa các mức: nếu chương trình có HÀNH VI KHÔNG XÁC ĐỊNH (tràn số có dấu, đọc bộ nhớ chưa khởi tạo, truy cập ngoài giới hạn, vi phạm strict-aliasing), trình tối ưu được phép giả định điều đó không bao giờ xảy ra và có thể xóa hoặc sắp xếp lại code tương ứng. Code 'chạy được' ở -O0 nhưng hỏng ở -O2 hầu như luôn che giấu hành vi không xác định — biên dịch với -Wall -Wextra và thử -fsanitize=undefined cục bộ để phát hiện.
Code của tôi có an toàn và riêng tư không?
Quyền riêng tư code phụ thuộc vào phương thức thực thi:
- Code được gửi đến Piston API (emkc.org) để biên dịch
- Piston là mã nguồn mở và được cộng đồng duy trì
- Code không được lưu trữ hay ghi log bởi Piston
- Thực thi xảy ra trong container cô lập
- Không truy cập hệ thống local của bạn
Để tối đa hóa quyền riêng tư, bạn có thể tự host Piston bằng Docker.
Tính Năng Chính
- Chạy code C online với GCC compiler
- Không cần cài đặt hay đăng ký
- Biên dịch và thực thi tức thì
- Chuyển chuẩn C: C89, C99, C11, C17
- -Werror một chạm (cảnh báo thành lỗi)
- Tùy chỉnh compiler flags và arguments
- Hỗ trợ standard input (stdin)
- Thông báo lỗi rõ ràng với số dòng
- Ví dụ code để học
- Tải code dưới dạng file .c
- Theo dõi thời gian thực thi
- Hỗ trợ chế độ tối
- Thiết kế responsive thân thiện mobile
- Miễn phí mãi mãi - hỗ trợ bởi Piston API
- Mã nguồn mở và cộng đồng hỗ trợ
