通过替换字符串的字母在 C 中出现分段错误



我想从字符串中替换字符(例如第二个字符)。我的代码怎么了?它可以编译,但是不做我需要的事情会给我一个细分错误。谢谢!

#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main (int argc, string argv[])
{
    string key="abcd";
    key[1]='f';
}

,在编译我的代码

之后
~/workspace/pset2/crack/ $ clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow bug.c -lcrypt -lcs50 -lm -o bug
~/workspace/pset2/crack/ $ ./bug
Segmentation fault

您只能修改堆或堆栈中的内存,您的 "abcd"有一个称为字符串字面的内容,并且属于程序的仅阅读内存空间,无法修改它它在哪里(如果它在任何体面的操作系统下都在运行)。

首先放置在那里的原因是因为string基本上只是char *指针,它将指向任何内存空间,并且不在乎它是否在仅读取空间中。(不要与C std::string混淆)。

要使它可以修改,您必须告诉C,它不是指针,而是一个数组。

char key[] = "abcd";

现在C将此字符串放在堆栈中,您可以随意修改它。

string key="abcd";

string基本上是 char *key是字符串文字。您尝试修改它,因此分段故障。

我看不到名称 string的定义,但我认为它是 char *

因此在此声明中

 string key="abcd";

声明了指向字符串字面的指针。

字符串文字在C中未经修改,任何尝试修改字符串文字结果的尝试中未定义的行为。

来自C标准(6.4.5字符串文字)

7,如果它们的阵列是否明显,则未指定 元素具有适当的值。如果程序尝试 修改这样的数组,行为不确定。

这是因为"abcd"并未真正复制到您的key变量中。相反,key是指向此常数字符串的指针。

如果您想对其进行修改,则可以做到这一点:

int main (int argc, string argv[])
{
    char key[] = { "some string" };
    key[1]='f';
}

相关内容

  • 没有找到相关文章

最新更新