提供的文本解释了使用字符指针 (char *string
) 和字符数组 (char string[]
) 来存储和修改 C 中的字符串之间的区别。为了清晰起见并改进流程,让我们重新表述一下:
C 代码示例展示了指针和数组之间的关键区别,这通常是初学者感到困惑的根源。 考虑这些片段:
示例 1(分段错误):
<code class="language-c">#include <stdio.h> int main(void) { char *string = "Wello, world!"; // string is a pointer string[0] = 'H'; // Attempting to modify a read-only string puts(string); }</code>
此代码会导致分段错误。 为什么?因为 string
被声明为指向字符的 指针。 该指针被初始化为指向字符串文字(“Wello,world!”),该字符串通常存储在只读存储器中。 尝试修改此只读内存的内容会导致分段错误(内存访问冲突)。
示例2(修改成功):
<code class="language-c">#include <stdio.h> int main(void) { char string[] = "Wello, world!"; // string is an array string[0] = 'H'; // Modifying a writable copy of the string puts(string); }</code>
此代码成功打印“Hello, world!”。 这里,string
被声明为 字符数组。编译器在堆栈上分配空间来保存字符串文字的副本。 该副本是可写的,允许修改string[0]
而不会导致错误。
主要区别:
根本的区别在于字符串的存储方式。 在示例 1 中,字符串文字驻留在只读存储器中,指针只是指向它。在示例 2 中,创建了字符串文字的可写副本并将其存储在堆栈上的数组中。
结论:
指针和数组是 C 中不同的数据类型。虽然它们在某些上下文中可能看起来相似,但它们的行为可能显着不同,尤其是在处理字符串文字时。 请始终注意这种区别,以避免意外错误和分段错误。 对可修改的字符串使用字符数组通常比使用指向字符串文字的字符指针更安全。
以上是分配C中的字符串的详细内容。更多信息请关注PHP中文网其他相关文章!