C编译器会自动在字符数组的末尾插入空字符吗?下面的代码会打印“Word”。那么C编译器会自动在数组的最后一个位置插入空字符吗?
int main() { char x[] = {'W', 'o', 'r', 'd'}; cout << x << endl; return 0; }
xiozqbni1#
不,它没有。您的数组x只有4个元素。您传递std::cout一个指向char的指针,它不是一个以空值结尾的字符串的开头。这是未定义的行为。例如,在我的平台上,类似的代码打印为Word?,带有一个虚假的问号。
x
std::cout
char
Word?
3bygqnnd2#
在C/C+.中,字符串文字会自动附加以零结尾。
char x[] = "Word";
则数组的大小将等于5,并且数组的最后一个元素将包含“\0”。当使用下面的记录时,如您所示
char x[] = {'W', 'o', 'r', 'd'};
则编译器分配的元素数与初始化器的个数完全相同。2也就是说,在这种情况下,数组只有4个元素。但是,如果您按照以下方式编写
char x[5] = {'W', 'o', 'r', 'd'};
则第五个元素将包含终止零,因为它没有对应的初始化器,并且将被零初始化。还要考虑以下记录在C中有效,但在C++中无效
char x[4] = "Word";
piah890a3#
这是未定义的行为,它打印“Word”,因为它也可能崩溃。
lmyy7pcs4#
不,如果你想把它作为一个字符串使用,或者你想用字符串库函数,你必须自己去做。
flvtvl505#
不,在这种情况下,你只是创建了一个非空终止的数组。如果是基于空终止的读操作,你的程序不会停止,因为它最终不会找到空值。
在这种情况下,将在末尾为x.Null分配5个字节。
iswrvxsc6#
不需要。如果您要自动插入,请使用字串常数:
const char *x = "Word"; //OR std::string const s = "Word"; const char *x = s.c_str(); //OR char x[] = { "Word" }; //using the C++11 brace initializer syntax.
验证这一点最简单的方法是使用调试器查看x的内存地址,并监视它和它后面的几个字节。在初始化之后停止调试器并检查内存内容。
sq1bmfud7#
不,如果要将char数组用作字符串,请使用以下形式的初始化程序
char x[] = { "Word" };
5q4ezhmt8#
虽然不能保证,但我的实现似乎总是添加一个\0,即使我没有被请求。我测试过noNull[2]总是\0
\0
noNull[2]
char noNull[] = {'H', 'i'}; for (int i = 2; i < 5; ++i) { if (noNull[i] == '\0') { std::cout << "index " << i << " is null" << std::endl; } else { std::cout << "index " << i << " is not null" << std::endl; } }
输出功率
index 2 is null index 3 is not null index 4 is not null
8条答案
按热度按时间xiozqbni1#
不,它没有。您的数组
x
只有4个元素。您传递std::cout
一个指向char
的指针,它不是一个以空值结尾的字符串的开头。这是未定义的行为。例如,在我的平台上,类似的代码打印为
Word?
,带有一个虚假的问号。3bygqnnd2#
在C/C+.中,字符串文字会自动附加以零结尾。
则数组的大小将等于5,并且数组的最后一个元素将包含“\0”。
当使用下面的记录时,如您所示
则编译器分配的元素数与初始化器的个数完全相同。2也就是说,在这种情况下,数组只有4个元素。
但是,如果您按照以下方式编写
则第五个元素将包含终止零,因为它没有对应的初始化器,并且将被零初始化。
还要考虑以下记录在C中有效,但在C++中无效
piah890a3#
这是未定义的行为,它打印“Word”,因为它也可能崩溃。
lmyy7pcs4#
不,如果你想把它作为一个字符串使用,或者你想用字符串库函数,你必须自己去做。
flvtvl505#
不,在这种情况下,你只是创建了一个非空终止的数组。如果是基于空终止的读操作,你的程序不会停止,因为它最终不会找到空值。
在这种情况下,将在末尾为x.Null分配5个字节。
iswrvxsc6#
不需要。如果您要自动插入,请使用字串常数:
验证这一点最简单的方法是使用调试器查看x的内存地址,并监视它和它后面的几个字节。在初始化之后停止调试器并检查内存内容。
sq1bmfud7#
不,如果要将
char
数组用作字符串,请使用以下形式的初始化程序5q4ezhmt8#
虽然不能保证,但我的实现似乎总是添加一个
\0
,即使我没有被请求。我测试过
noNull[2]
总是\0
输出功率