Kodewick
开始学 →

C 语言在线运行

免费,不用装 gcc,不用登录。写完就跑,还能一步一步看每个指针、每块 malloc 出来的内存。

试试:
C 语言在线运行全屏 · 代码和输出都还在
C
例子
swap.c
#include <stdio.h>

void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int main(void) {
    int x = 3, y = 5;
    swap(&x, &y);
    printf("%d %d\n", x, y);
    return 0;
}
输出

按「运行」看结果

gcc 13 · C11第 1 行,第 1 列缩进 4 空格学 C →改一改就会存进「我的代码」
不只是运行

看它怎么跑:栈、堆、每一个指针,一步一步画出来

每个变量在它那层函数的栈帧里,malloc 出来的块在右边的堆上,指针就是一根箭头。free 掉的块变灰,没人指着又没 free 的标红。

▶ 就在这里播放,不用登录
调试和分享

能跑,能停,能回放,能发出去

像在本地用 VS Code 一样顺手,还多了本地没有的:把每一步画出来。

单步

一行一行地跑,每个变量的值都摆在旁边

按「单步」,代码停在每一行:亮的是马上要跑的那行,旁边是此刻每个变量的值。也能往回退,← → 键就能走。

一行一行地跑,每个变量的值都摆在旁边
出错回放

出错了?直接看它是怎么错的

报错下面有「看看怎么错的」:可视化停在出错的那一步,红色标出来,还用人话说清楚原因。前面每一步都能倒回去看。

出错了?直接看它是怎么错的
分享

链接、动图、代码图片,一键发到 X

一个链接打开就是这段代码;也能导出运行过程的动图(浅色 / 深色、横版 / 竖版)和代码图片,发到 X、小红书、群聊,或嵌进博客。

链接、动图、代码图片,一键发到 X
例子

12 个 C 例子,点一下就在上面运行

每个都能单步、能可视化,改一改再跑。

scanf 读输入

scanf 等你输入两个数,在输出面板里直接输入。

#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d + %d = %d\n", a, b, a + b);
    return 0;
}

用指针交换两个数

经典题:为什么 swap 要传 &x、&y。

#include <stdio.h>

void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int main(void) {
    int x = 3, y = 5;
    swap(&x, &y);
    printf("%d %d\n", x, y);
    return 0;
}

数组和指针

a[i] 和 *(p + i) 是同一个元素。

#include <stdio.h>

int main(void) {
    int a[4] = {10, 20, 30, 40};
    int *p = a;
    for (int i = 0; i < 4; i++)
        printf("%d %d\n", a[i], *(p + i));
    return 0;
}

反转字符串

字符数组、strlen,从两头往中间交换。

#include <stdio.h>
#include <string.h>

int main(void) {
    char s[20] = "hello";
    int n = strlen(s);
    for (int i = 0; i < n / 2; i++) {
        char t = s[i];
        s[i] = s[n - 1 - i];
        s[n - 1 - i] = t;
    }
    printf("%s\n", s);
    return 0;
}

malloc 动态数组

在堆上要 n 个 int,用完 free。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *sq = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
        sq[i] = i * i;
    for (int i = 0; i < n; i++)
        printf("%d ", sq[i]);
    printf("\n");
    free(sq);
    return 0;
}

结构体数组

在一组学生里找最高分。

#include <stdio.h>

struct Stu {
    char name[10];
    int score;
};

int main(void) {
    struct Stu s[3] = {{"Lin", 88}, {"Zhou", 95}, {"Chen", 79}};
    int best = 0;
    for (int i = 1; i < 3; i++)
        if (s[i].score > s[best].score) best = i;
    printf("%s %d\n", s[best].name, s[best].score);
    return 0;
}

链表

用 malloc 建节点、指针连起来,最后一个个 free。

#include <stdio.h>
#include <stdlib.h>

struct Node {
    int val;
    struct Node *next;
};

int main(void) {
    struct Node *head = NULL;
    for (int i = 3; i >= 1; i--) {
        struct Node *p = malloc(sizeof(struct Node));
        p->val = i;
        p->next = head;
        head = p;
    }
    for (struct Node *p = head; p != NULL; p = p->next)
        printf("%d ", p->val);
    printf("\n");
    while (head) {
        struct Node *nx = head->next;
        free(head);
        head = nx;
    }
    return 0;
}

二维数组

乘法表,在可视化里按表格画出来。

#include <stdio.h>

int main(void) {
    int t[3][4];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            t[i][j] = (i + 1) * (j + 1);
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++)
            printf("%3d", t[i][j]);
        printf("\n");
    }
    return 0;
}

递归:斐波那契

函数调用自己:看栈帧一层层叠起来。

#include <stdio.h>

int fib(int n) {
    if (n <= 2) return 1;
    return fib(n - 1) + fib(n - 2);
}

int main(void) {
    printf("%d\n", fib(6));
    return 0;
}

冒泡排序

相邻两个比较交换,直到整个数组排好。

#include <stdio.h>

int main(void) {
    int a[6] = {5, 2, 9, 1, 7, 3};
    int n = 6;
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j + 1]) {
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

FizzBuzz

循环、% 和 if / else if。

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 15; i++) {
        if (i % 15 == 0) printf("FizzBuzz\n");
        else if (i % 3 == 0) printf("Fizz\n");
        else if (i % 5 == 0) printf("Buzz\n");
        else printf("%d\n", i);
    }
    return 0;
}

数组越界

真 gcc 会悄悄跑下去;这里停在越界的那一下,告诉你为什么。

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    int sum = 0;
    for (int i = 0; i <= 5; i++)
        sum += a[i];
    printf("%d\n", sum);
    return 0;
}
三步

怎么在线运行 C

  1. 1
    写代码,或选一个例子编辑器和 VS Code 一样:自动补全、括号配对、Ctrl+/ 注释。
  2. 2
    点「运行」,或按 Ctrl + Enter结果在旁边的输出里;程序要 scanf() 时直接在输出里回答。
  3. 3
    想看过程:点「单步」或「可视化」代码自动存在这个浏览器里,「我的代码」里能找回来。
支持什么

C,在你的浏览器里跑

✓ 支持

  • C11:指针、数组、结构体、联合、枚举、函数指针
  • stdio、stdlib、string、math、ctype 等常用头文件
  • scanf、getchar 在输出面板里读输入
  • malloc / free,泄漏、释放后再用都会指出来
  • 编译错误和警告用 gcc 的原话

✕ 暂不支持

  • 线程、网络、信号、读写电脑上的文件
  • 内联汇编和编译器扩展
  • 标准库以外的库
  • 停不下来的程序(30 秒后自动停)
常见问题

关于 C 在线运行

要钱吗?要注册吗?

都不用。打开就能写 C、能跑;代码存在你自己的浏览器里。

这是真的 gcc 吗?

这是我们自己写、在你浏览器里运行的 C 引擎,对 C11 程序的输出和 gcc 13 一样。和 gcc 不同的是:数组越界这种「未定义行为」它会停下来,告诉你在哪一行。

程序要 scanf,在哪输入?

运行到 scanf 时,输出面板里会出现输入框,输完按回车,程序接着跑。

怎么看指针和内存?

点「可视化」:左边是栈,右边是堆,每个指针是一根箭头。free 掉的块变灰,泄漏的最后标红。

程序崩了,能看出为什么吗?

报错下面点「看看怎么错的」:可视化停在出错那一步,可以一步步往回看。

手机上能用吗?

能。点一下代码就全屏写,有 Tab、花括号、分号这些专门的按键。

代码存在哪?

存在这个浏览器里,「我的代码」能找回来;重要的可以分享成链接存一份。

怎么发给别人?

「分享」→ 复制链接,或者导出运行过程的动图、代码图片,一键发到 X。

还有

另外四种语言,同样能跑、能看