在另一个函数中修改char*?(分段故障)

Dif*_*der -2 c arrays segmentation-fault

我正在尝试修改main(tab)中声明的char数组.所以我将它发送到modify_tab并修改它.但它不起作用并向我发送分段错误.这是我的代码:

  1?void    my_putstr(char *str)
  2?{
  3?  int   i;
  4?
  5?  i = 0;
  6?  while (str[i] != '\0')
  7?    {
  8?      write(1, &str[i], 1);
  9?      i++;
 10?    }
 11?}
 12?
 13?void    modify_tab(char *tab)
 14?{
 15?  char  *map;
 16?
 17?  map = tab;
 18?  map[3] = 'a';
 19?  my_putstr(map);
 20?}
 21?
 22?void    main()
 23?{
 24?  char  *tab;
 25?
 26?  tab = "0123456789\n\0";
 27?  my_putstr(tab);
 28?  modify_tab(tab);
 29?}
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 6

tab指向字符串文字,修改字符串文字是未定义的行为.一个可行的替代方案是char数组:

char  tab[] = "0123456789\n" ;
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要使用null终止sting文字,在这种情况下它也将在您的原始代码中终止.

关于修改字符串文字的C99标准草案的相关引用将来自6.4.5 字符串文字6段,其中说明(强调我的未来):

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

对于null,终止字符串文字将在第5段中返回

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.66) [...]

在初始化数组的情况下,该部分是6.7.8 初始化:

字符类型数组可以由字符串文字初始化,可选地用大括号括起来.字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.