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

时间:2014-02-15 18:09:32

标签: 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│}

2 个答案:

答案 0 :(得分:6)

tab指向字符串文字,修改字符串文字是undefined behavior。可行的替代方案是char数组:

char  tab[] = "0123456789\n" ;

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

draft C99 standard关于修改字符串文字的相关引用来自6.4.5 字符串文字段落 6 ,其中写着(强调我的前进):

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。

并且对于null,终止字符串文字将返回段落 5

  

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

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

  

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

答案 1 :(得分:1)

正如您所定义的那样,tab不是一个字符数组,它是一个指针。要使tab成为一个字符数组,请改为:

 char tab[] = "0123456789\n\0";