You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解引用同一地址触发Bus error,K&R squeeze程序是否具备可移植性?

为什么修改字符串字面量会触发Bus Error?
  • 你测试代码里的char* str = "foo";定义的是字符串字面量,这类数据在多数操作系统中会被存入只读内存区域(比如.rodata段)。尝试修改只读内存的内容属于未定义行为,直接触发Bus error是典型表现。
  • K&R书中的squeeze函数本身具备可移植性,但它的前提是传入可修改的字符数组,而非字符串字面量。字符串字面量是只读的,不能作为这类修改函数的参数。

修正后的测试代码(使用可写的字符数组):

int main() {
    char str[] = "foo"; // 数组形式存储,内容在栈上可修改
    for (int i = 0, j = 0; str[i]; ++i)
        str[j] = '.';
}

squeeze函数的正确使用示例:

#include <stdio.h>

void squeeze(char s[], int c)
{
    int i, j;

    for (i = j = 0; s[i] != '\0'; i++)
        if (s[i] != c)
            s[j++] = s[i];
    s[j] = '\0';
}

int main() {
    char str[] = "hello world"; // 可修改的字符数组
    squeeze(str, 'l');
    printf("%s\n", str); // 输出:heo word
    return 0;
}

内容的提问来源于stack exchange,提问作者L.S. Roth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:25:24