使用自己版本的memset和char * s =" Hello" vs char s [] ="你好"。请说明为什么一个人没有设置内存但会打印阵列?

时间:2018-03-04 04:07:06

标签: c arrays

我想理解将一个指向声明和初始化的字符数组的指针的格式与选择示例char *s = "Hello";的数组之间的区别,并让它以更常见的方式声明数组{{} 1}}

我重新创建了memset并尝试在第一个声明示例中使用它,导致总线错误。我不明白为什么因为从我收集的内容来看,在C中,第一种声明和初始化数组的方法应该与它们如何存储在堆栈内存和指针上的方式相同通过引用我的函数传递数组时,能够与数组地址进行交互。

问题是我无法改变数组的第一个版本,但是我可以使用printf打印它,因此建议改变它应该是可能的,因为它存在于内存中的某个地方并且我可以访问它的地址。

我只想清楚解释两种格式的内幕情况。是什么让一个人达到了目标,而另一个人没有。

我的目标是尽可能多地了解C,您的帮助将使我很快欣赏语言的美丽,并清楚地了解其所有组件如何协同工作以有效地解决问题问题。

以下是我的代码:

适用于我的ft_memset.c功能的格式
format that works with my ft_memset.c funct

格式不起作用,但能够打印阵列
format that doesn't work, yet able to print the array - why??

1 个答案:

答案 0 :(得分:0)

尝试修改字符串文字是undefined behavior。 §6.4.5¶7(这是你在第一种情况下所做的)。

有一个问题是某些实现是否允许您对其进行更改。 标准不会在该行上强加任何内容。它只是说修改字符串文字是未定义的行为。

从我的说法开始,在大多数实现中,字符串文字放在只读部分,使它们不可修改。在你的情况下,你看到了问题 - 因为你试图修改它,导致BUS错误。 (在你的情况下,你看到了这一点)。

第一个只是一个指向字符串文字的指针 - 所以一切都说明了。

第二个是创建一个数组并使用字符串文字的内容对其进行初始化,这是可修改的。你可以随心所欲地做任何事。 §6.7.9¶14根据您放置的位置,它可能具有静态存储持续时间或自动存储持续时间。 (静态存储持续时间 - 放在文件范围内时,放在块范围内时自动)。

从前面引用的非常标准 - 它来自§6.4.5¶6(关于字符串文字的存储)

  

然后使用多字节字符序列初始化一个静态存储持续时间和长度的数组,该数组足以包含该序列。

链接来自C11标准N1570