在C语言中,char a[] = "string literal";
和 char *p = "string literal";
是两种不同的初始化方式,它们在内存分配和可修改性方面有显著的区别。
1. char a[] = "string literal";
这种方式定义了一个字符数组,并将字符串字面量的内容复制到这个数组中。
特点:
- 内存分配:字符数组
a
会在栈上分配足够的空间来存储字符串字面量以及末尾的空字符('\0'
)。 - 可修改性:字符数组的内容是可以修改的。例如,你可以改变数组中的某个字符。
示例:
#include <stdio.h>
int main()
{
char a[] = "string literal";
a[0] = 'S'; // 合法,可以修改字符数组的内容
printf("%s\n", a); // 输出: String
return 0;
}
2. char *p = "string literal";
这种方式定义了一个指向字符串字面量的指针。
特点:
- 内存分配:字符串字面量通常存储在只读内存区域(如代码段),而指针
p
只是指向这个位置。 - 不可修改性:由于字符串字面量存储在只读内存区域,因此通过指针
p
不能修改字符串的内容。尝试修改会导致未定义行为。
示例:
#include <stdio.h>
int main()
{
char *p = "string"; //
p[0] = 'S'; // 非法,会导致未定义行为
printf("%s\n", p); // 输出: string
return 0;
}
总结
char a[] = "string literal";
:定义了一个字符数组,内容可以被修改。char *p = "string literal";
:定义了一个指向字符串字面量的指针,内容不可被修改。
选择哪种方式取决于你是否需要修改字符串的内容。如果需要修改,使用字符数组;如果不需要修改,可以使用指针指向字符串字面量。