在C中声明和修改字符串

时间:2015-06-04 21:11:32

标签: c string variables

我最近开始尝试学习C编程语言。在我的第一个程序(简单的hello world事物)中,在我意识到我不能只做variable_name = "string data"后,我遇到了声明字符串的不同方法:

char *variable_name = "data"
char variable_name[] = "data"
char variable_name[5] = "data"

我不明白的是它们之间的区别。我知道它们是不同的,其中一个专门分配了一定数量的内存来存储数据,但这就是它,我觉得我需要在C中转移到更复杂的概念之前理解它。

另外,为什么使用*variable_name让我将变量名称重新分配给新字符串,但variable_name[number]variable_name[]却没有?当然,如果我给它分配10个字节(char variable_name[10] = "data")并尝试将其重新分配给10个字节或更小的东西它应该有效,那么为什么不呢?

空括号和星号是做什么的?

1 个答案:

答案 0 :(得分:7)

在此声明中

char *variable_name = "data";

声明了一个指针。该指针指向字符串文字“data”的第一个字符。编译器将字符串文字放在内存的某个区域,并通过文字的第一个字符的地址指定指针。

您可以重新指定指针。例如

char *variable_name = "data";
char c = 'A';

variable_name = &c;

但是,您可能无法更改字符串文字本身。尝试更改字符串文字会导致程序的未定义行为。

在这些声明中

char variable_name[] = "data";
char variable_name[5] = "data";

声明了两个数组元素,这些元素由用于初始化字符串文字的字符初始化。例如这个声明

char variable_name[] = "data";

等同于以下

char variable_name[] = { 'd', 'a', 't', 'a', '\0' };

该数组将包含5个元素。因此,此声明完全符合声明

char variable_name[5] = "data";

如果要指定其他大小的数组,则会有所不同。例如

char variable_name[7] = "data";

在这种情况下,数组将按以下方式初始化

char variable_name[7] = { 'd', 'a', 't', 'a', '\0', '\0', '\0' };

这是没有显式初始化器的数组的所有元素都是零初始化的。

注意在C中你可以用以下方式使用字符串文字声明一个字符数组

char variable_name[4] = "data";

字符串文字的终止零不会放在数组中。 在C ++中,这样的声明无效。

当然,如果需要,您可以更改数组的元素(如果它没有定义为常量数组)。

考虑到您可以将用作初始化器的字符串文字括在大括号中。例如

char variable_name[5] = { "data" };

在C99中,您还可以使用所谓的目标初始值设定项。例如

char variable_name[] = { [4] = 'A', [5] = '\0' };

这是一个示范程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char variable_name[] = { [4] = 'A', [5] = '\0' };

    printf( "%zu\n", sizeof( variable_name ) );
    printf( "%zu\n", strlen( variable_name ) );

    return 0;
}

程序输出

6
0

当ypu应用标头strlen中声明的标准C函数<string.h>时,它会返回0,因为在索引为4的元素之前的数组的第一个元素初始化为零。