我试图修改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│}
答案 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";