Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过将0';s(分段故障)_C_Split_C Strings_String Literals - Fatal编程技术网

C 通过将0';s(分段故障)

C 通过将0';s(分段故障),c,split,c-strings,string-literals,C,Split,C Strings,String Literals,一个非常简单的C程序:我想在字符串的某些点上放置0,以获得子字符串。但在第一次尝试时,我在执行时遇到了分段错误: #include<stdio.h> #include<string.h> int main() { char *a = "eens kijken of we deze string kunnen splitten"; a[4] = '\0'; // this causes the segfault char *b

一个非常简单的C程序:我想在字符串的某些点上放置0,以获得子字符串。但在第一次尝试时,我在执行时遇到了分段错误:

#include<stdio.h>
#include<string.h>
int main() {
        char *a = "eens kijken of we deze string kunnen splitten";
        a[4] = '\0'; // this causes the segfault
        char *b = a[5]; // sort of guessed this can't work...
        printf("%s", a);
}
#包括
#包括
int main(){
char*a=“we deze string kunnen splitten的eens kijken”;
a[4]='\0';//这会导致SEG故障
char*b=a[5];//有点猜测这行不通。。。
printf(“%s”,a);
}

那么主要的问题是:为什么segfault在
a[4]='\0'第二步,我想根据字符串索引,用最少的代码拆分此字符串…

您正在尝试更改字符串文字

char *a = "eens kijken of we deze string kunnen splitten";
字符串文字在C中是不可变的。任何更改字符串文字的尝试都会导致未定义的行为

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

7未具体说明这些阵列是否不同,前提是它们的 元素具有适当的值如果程序试图 修改这样一个数组,行为将不确定。

而是声明一个字符数组

char a[] = "eens kijken of we deze string kunnen splitten";
也在本宣言中

char *b = a[5];
有一个打字错误。应该是

char *b = &a[5];


变量
a
指向字符串文字的指针。 这些常量存储在生成的可执行文件的不可写部分中。 试图在该区域写入任何内容都会导致SEG故障

字符串数组(
chara[]='literal';
)将把字符串放在正确的位置并允许写入

编辑:
您的语法(取消)引用char*是正确的,但编译器会以不同的方式处理它。

在C中,所有字符串文字都是字符数组,不允许修改(数组实际上是只读的)。这就是为什么在指向这样的字符串时应该始终使用
const char*
的原因。因此,只需编写一个[]或*a来定义它是否为常量char*,对吗?因为本质上它们都只是指针(a[]和*a)@Niels数组不是指针。其次,在第一种情况下,指针指向一个字符串文字,该字符串文字表示静态存储持续时间。在第二种情况下,当使用数组时,字符串文本的元素将复制到数组的元素中。
char *b = a + 5;