gcc 4.4.4 c89
我将添加到此列表中.所以我期待NULL终止它.但是,我收到警告:"Initialization makes integer from pointer without a cast"
当我没有在那个结构中使用时,它为什么提到整数?
我想在这种情况下数组和指针在哪里相同?
struct company_prof
{
char name[32];
size_t age;
char position[32];
} employee[] = {
{ "Job Bloggs", 23, "software engineer" },
{ "Lisa Low" , 34, "Telecomms Technician" },
{ "simon smith", 38, "personal assistist" },
{ NULL , -1, NULL }
};
Run Code Online (Sandbox Code Playgroud)
非常感谢任何建议,
在这种情况下,您将静态地为结构中的字符串分配空间.字符串的空间实际上并不是与结构分开的实体,它只是一块空间.因此,您无法为这些字段分配指针,因为它们无法引用任何其他内容 - 它们只是用于引用结构中这些块的开头的方便名称.
你得到转换的原因是字符(例如name[0])是小整数,并且它试图将NULL指针填充到每个字符串的第一个字符中.第一个字符太小而无法容纳指针,所以它会给你一个警告.
你可能想用"\0"而不是在NULL这里.这是一个空字符串或空字符串,它与空指针有点不同.
编辑:您可以考虑获取列表大小的替代方法是使用sentinel值,而是定义一个常量,从大小(以字节为单位)计算它.典型的结构如下:
static const int num_employees = sizeof(employee) / sizeof(employee[0]);
Run Code Online (Sandbox Code Playgroud)
您正在尝试使用初始化字符数组NULL.这没有任何意义.例如,您将收到相同的警告
char a[100] = { NULL };
Run Code Online (Sandbox Code Playgroud)
并且以完全相同的方式没有任何意义.
诊断消息中提到的"整数"是字符数组的第一个元素.char是C中的整数类型,当你写
char a[100] = { NULL };
Run Code Online (Sandbox Code Playgroud)
它是初始化数组的第0个元素的尝试a用NULL.在您的平台上,NULL被声明为具有指针类型的东西,这就是为什么诊断消息说您试图a[0]从指针(NULL)创建一个整数()而没有强制转换.
一个更简单的例子可能如下所示
char c = NULL;
Run Code Online (Sandbox Code Playgroud)
它会因同样的原因为你赢得相同的诊断信息.
我可能会问,为什么要尝试初始化char用NULL?你的意图是什么?
如果您不打算在初始化后写入name和position数组,也许您应该使用指针而不是数组
struct company_prof
{
const char *name;
size_t age;
const char *position;
} employee[] = {
{ "Job Bloggs", 23, "software engineer" },
{ "Lisa Low" , 34, "Telecomms Technician" },
{ "simon smith", 38, "personal assistist" },
{ NULL , -1, NULL }
};
Run Code Online (Sandbox Code Playgroud)
在形式上,在这种情况下NULL完全有道理.但不是在数组的情况下.
但不太正式的是,{ NULL, -1, NULL }阵列末尾的记录的目的并不清楚.是某种终止元素?为什么不直接使用数组的确切大小而不是创建终止元素?
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |