4

我是 C 的新手。我指的是 Brian W Kernighian 和 Dennis Ritchie 的《The C Programming Language》一书。书中给出了指针递增和赋值的代码,如下所示。

#include<stdio.h>

int main()
    {
        char *s = "Goal";
        char *t = "Home";
        while(*s++ = *t++) printf(*s);
        return 0;
    }

使用命令保存和编译代码

gcc ptr.c -o ptr -std=c99

现在通过运行命令运行代码

./ptr

我收到以下错误

分段错误(核心转储)

错误似乎在while循环条件内。但代码与书中给出的完全相同。我错过了什么?

4

3 回答 3

4

sandt都是字符串文字,您不能修改字符串文字。但是这段代码

*s++ = *t++

将修改s,这会导致分段错误。

要修复它,请使用char数组。我还修改了该printf部分以使其合法。

#include<stdio.h>

int main()
{
    char arr[] = "Goal";
    char *s = arr;
    char *t = "Home";
    while(*s++ = *t++) 
        ;
    printf("%s\n", arr);
    return 0;
}

但是,我认为这个程序最好使用单独的函数来复制字符串,程序看起来会更清晰。

#include<stdio.h>
void my_strcpy(char *s, char *t);

int main()
{
    char s[] = "Goal";
    char *t = "Home";
    my_strcpy(s, t);
    printf("%s\n", s);
    return 0;
}

void my_strcpy(char *s, char *t)
{
    while(*s++ = *t++) 
        ;
}
于 2013-09-21T04:27:47.440 回答
1

问题是printf期望第一个参数是 a char *,即指向一个字符的东西,或者一个字符的地址。当您说printf(*s)您要传递一个实际字符时,即从 0 到 255 或 -128 到 127 的数字,并且程序将把该数字视为地址,这不会是您的有效地址系统。

于 2013-09-21T04:35:15.783 回答
0

每当我们说 *s = "hello" 时, s 指向的地址是文本段中存在的地址(“hello” 进入文本段)。所以很明显,改变文本段的值会导致 SEGV 终止。

对于 s[] = "hello",如果我们执行 *s++,我们正在递增(修改)基地址,所以我们得到“需要左值作为递增操作数”错误。

于 2014-11-19T10:59:40.987 回答