C语言 得到“分段故障(核心转储)错误,我不知道为什么

g6baxovj  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(96)
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    string a = "bob";
    string b = "steve'";
    for (int c = 0, n = strlen(b); c < n; c++)
    {
        a[c] = b[c];
        if (a[c] == '\0')
        {
            a[c+1] = '\0';
            a[c] = b[c];
        }
        if (b[c] == '\0')
        {
            a[c] = '\0';
            break;
        }
    }
    printf("%s", a);
}

错误发生在第一行表示a[c] = B[c]的行,或者第12行代码。代码的目的是尝试将字符串a更改为字符串B。然而,似乎我不能使数组的两个字符相等。有什么办法可以做到吗?
为了使这些字符串相同,我只是尝试使它们的字符相等。这导致了分段故障(核心转储)。

bweufnob

bweufnob1#

对于初学者来说,似乎有一个错字

"steve'"
      ^^

然而,指针ab声明为

string a = "bob";
string b = "steve'";

其中名称string是类型char *的别名,指向字符串文字"bob""steve"
在这个for循环中

for (int c = 0, n = strlen(b); c < n; c++)
{
    a[c] = b[c];
    //...

你正在尝试改变一个字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。此外,在if语句中

if (a[c] == '\0')
    {
        a[c+1] = '\0';
        a[c] = b[c];
    }

你甚至试图在内存中写入字符串字面量之外的内容。
来自C标准(6.4.5字符串文字)
7如果这些数组的元素具有适当的值,则未指定这些数组是否是不同的。如果程序试图修改这样的数组,则行为未定义。
你需要声明至少一个字符数组来代替指向字符串的指针,字符串将被复制到这个数组中。
例如你可以写

#include <stdio.h>

int main(void)
{
    char b[] = "steve";
    char a[sizeof( b )] = "bob";

    for ( size_t i = 0; ( a[i] = b[i] ) != '\0'; );

    puts( a );
}

相关问题