我正试图修改main(tab)中声明的一个char数组。所以我把它发送到modify_tab,然后我修改它。但它不起作用,并发送给我一个分段错误。这是我的代码:
1│void my_putstr(char *str)
2│{
3│ int i;
4│
5│ i = 0;
6│ while (str[i] != ' ')
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 = "0123456789n ";
27│ my_putstr(tab);
28│ modify_tab(tab);
29│}
tab
指向字符串文字,修改字符串文字是未定义的行为。一个可行的替代方案是字符数组:
char tab[] = "0123456789n" ;
注意,您不需要用null来终止一个sting文本,在这种情况下,它会为您终止,在您的原始代码中也是如此。
C99标准草案中关于修改字符串文字的相关引用来自6.4.5
字符串文字第6段,其中写道(强调我的未来):
如果这些数组的元素具有适当的值如果程序试图修改这样的数组,则行为为未定义
并且对于null终止,字符串文字将返回到段落5中
在转换阶段7中,将值为零的字节或代码附加到每个多字节由一个或多个字符串文字产生的字符序列66)[…]
并且在初始化阵列的情况下,部分是6.7.8
初始化:
字符类型的数组可以由字符串文字初始化,也可以选择用大括号围起来。字符串文字的连续字符(包括如果有空间或数组大小未知,则终止null字符)初始化数组的元素。
正如您所定义的,tab
不是一个字符数组,它是一个指针。要使tab
成为一个字符数组,请执行以下操作:
char tab[] = "0123456789n ";