C++中使用char和char[1]有什么区别(如果有的话)。
例子:
struct SomeStruct
{
char x;
char y[1];
};
对于unsigned char,是否遵循相同的原因?
C++中使用char和char[1]有什么区别(如果有的话)。
例子:
struct SomeStruct
{
char x;
char y[1];
};
对于unsigned char,是否遵循相同的原因?
SomeStruct a;
a.x = 'a';
a.y[0] = 'a';
SomeStruct b;
b.x = a.x; // OK
b.y = a.y; // not OK
b.y[0] = a.y[0]; // OK
但是,y
不可分配的事实并不能阻止SomeStruct
的可分配性:
b = a; // OK
这一点与类型无关,无论是 char
还是其他类型。在内存中,一个此类型的对象和一个大小为1的数组基本上是相同的。
顺便说一下,在某些情况下,选择使用 char
和 char[1]
会产生很大的区别,有时会让人们误以为数组实际上是指针。虽然不是你的例子,但作为函数参数:
void foo(char c); // a function which takes a char as a parameter
void bar(char c[1]); // a function which takes a char* as a parameter
void baz(char c[12]); // also a function which takes a char* as a parameter
bar
和baz
中提供的声明中的数字在C++语言中完全被忽略。显然,某个人曾经认为它对程序员是有用的,作为文档的形式,表明函数baz
正在期望其指针参数指向一个包含12个char元素的数组的第一个元素。
在bar
和baz
中,c
从来没有数组类型 - 它看起来像是数组类型,但实际上不是,它只是一种带有与char *c
相同含义的花哨的特殊情况语法。这就是为什么我在“使用”上加了引号 - 你根本没有真正使用char[1]
,它只是看起来像是这样的。
y
是一个指针。 - casablancax
的类型为char
,而y
的类型为char[1]
。我知道这听起来像是在说显而易见的事情,但这真的是主要区别。例如,您无法将y
传递给期望char
类型参数的函数。但是当传递给sizeof
运算符时,x
和y
最终都将返回相同的值,并且两者在内存中表示方式可能完全相同。此外,y
可以降级为指针,这意味着您可以将其传递给类似于strcpy
的函数,但是您不能对x
做到这一点。 - Charles Salvia!a.x
和!a.y
都可以工作,但意义完全不同。而cout << a.x
可能会产生预期的结果,但cout << a.y
只会产生无意义的结果。 - Johannes Schaub - litbchar* p; char a[1]; assert(sizeof(p) == sizeof(a));
将会失败;这完全与类型有关,而不是与左值或右值有关。 - Roger Patechar y[1]
,那么很可能你遇到了结构体hack的实例。#include
它,头文件就会变成C ++,所以可以将其视为我的规则例外。 - Steve Jessopstruct dirent
。 - Steve Jessoptemplate <int N> void f(char(&a)[N])
,其中char x = '\0'; f(&x);
不匹配。可靠地捕获数组参数的大小非常方便和令人放心。