尝试更改指针会使程序停止执行

时间:2018-02-21 18:10:47

标签: c string pointers

我在Code Wars上练习,但我遇到了一个奇怪的问题。省略一些细节:任务是将每个数字的补码替换为9,并将每个字母移动一个给定的数字。为此,我做了这个循环,我认为应该根据其ANSI代码表示更改每个字符:

char *str = "ABC 123!"; // example
int n = 1; // example

for (char *c = str; *c; c++) {
    printf("Before: *c = %d\n", *c);
    if (*c > 47 && *c < 58) {
        *c = 105 - *c;
        // replace digit
    }
    if (*c > 64 && *c < 91) {
        *c = (*c - 64 + number) % 26 + 64;
        // replace letter
    }
    printf("After: *c = %d\n", *c);
}

我已经在各个地方做了各种日志声明,我可以从中判断出某些条件检查失败并且我进入if块,而其他成功,我进入if块,但是当我遇到*c = ...;语句时,测试崩溃(也尝试在单独的IDE中运行相同的代码) ,但执行仍然突然停止)。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

尝试修改字符串文字有undefined behavior 。在你的情况下程序停止,因为你试图修改不可修改的。 (通常它放在.rodata部分 - 只读)。但是,直接修改char的可变数组,或通过指针修改不是未定义的行为,甚至 虽然它的初始化程序是一个文字字符串。以下情况很好:

char str[] = "ABC 123!";

这就是从代码中获取正确行为所需的全部内容。我们不用二进制编写代码的原因之一是使人类可读。此处不是4758使用'0''9'等,而是使用SET @cnt=0; SELECT s.* FROM (SELECT ( @cnt := @cnt + 1 ) AS rank, a.* FROM one AS a ORDER BY a.salary DESC) AS s WHERE s.rank = '3';