通过放置0分割c字符串(segfault)

时间:2019-12-01 08:50:13

标签: 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 = a[5]; // sort of guessed this can't work...
        printf("%s", a);
}

主要问题是:为什么在a[4] = '\0';出现段错误,我想基于字符串索引以最少的代码拆分此字符串...

2 个答案:

答案 0 :(得分:2)

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

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];

char *b = a + 5;

答案 1 :(得分:1)

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

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

编辑: 您的语法(去)引用char *是正确的,但是编译器将以不同的方式对待它。