解引用同一地址触发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
相关产品推荐
相关产品推荐

