我写了这个C代码,在C上设置了NULL
一个结构数组。在这里,
struct Worker
{
char name[50];
unsigned int salary;
};
int main()
{
int n;
struct Worker number[50];
for(n=0;n<50;n++)
{
number[n].name=NULL;
}
}
编译器发出此错误:main.c:65:26: error: assignment to expression with array type
。
答案 0 :(得分:2)
在你的结构中,字段name
是一个包含50个字符的数组。数组不是指针,你不能改变它们;你只能改变他们的内容。
因此,如果要初始化name
字段,可以通过使第一个char为空终止符来使名称成为空字符串:
*number[n].name = '\0';
请注意,您的名字将始终包含50个字符,但您只使用第一个终止符之前的字符。
由于您的数组不是指针,因此以下方法不起作用:
number[0].name = "Tom";
您必须将内容填充到数组中,可能来自strcpy
的{{1}}:
<string.h>
如果要测试字符串是否为空,请测试第一个字符是否为空终止符:
strcpy(number[0].name, "Tom");
您还可以明确初始化数组:
if (*number[n].name == '\0') ... // string is empty
这将为您提供3名姓名和工资的工人以及47名空字符串作为姓名和零工资的工人。当然,您可以稍后填写它们或重置前三个。
如果使用以下命令初始化数组:
struct Worker number[50] = {
{"Alice", 3200},
{"Bob", 2700},
{"Charlotte", 3000}
};
你将得到一个所有空名的所有零工资工人的数组,你可以填补。
(也就是说,如果您的struct Worker number[50] = {{""}};
成员是指针name
,您可以说char *name;
或number[n].name = "Tom";
。但这意味着您必须处理指针指向自己的所有内存,这并不容易。
50个字符数组的优点是每个工作人员已经有50个字符可供您的名字使用。 (好吧,最多49个加上一个空终止符。)缺点是你在大多数名字上浪费了内存,因为它们更短,如果你需要更长的名字,你就不够灵活。但在您了解有关指针和内存管理的更多信息之前,阵列是可行的方法。只要确保你没有超出其限制。)
答案 1 :(得分:1)
你的名字是50个字符的数组,如果你想清除它而不是:
num[n].name=NULL;
做的:
memset(num[n].name, 0, 50);
您可以设置为NULL指针而不是数组。
您可以通过检查每个数组elem来查看数组是否为空,如:
int i;
int non_empty = 0
for( i=0; i < sizeof(array)/sizeof(array[0]); ++i)
{
if(array[i] != 0)
{
non_empty = 1;
break;
}
}
答案 2 :(得分:1)
你不能像这样设置一个字符数组为null;没有意义。从字面上看,没有指针。数组不是指针;他们的内存已经在堆栈中分配,所以我不能重新定位数组你如何尝试这样做。您正在尝试手动设置阵列的地址。
但是,如果您的结构看起来像这样
struct Worker{
char *name;
unsigned int salary;
};
然后,您就可以将每个工作人员的姓名设置为空。
如果您想将一系列字符归零,可以这样做
int n, j;
struct Worker number[50];
for(n=0;n<50;n++)
for(j=0;j<50;j++)
number[n].name[j]=0;
但我不知道你为什么要那样做。我假设您可以使用strcpy为每个工作人员的名称分配值,该名称负责处理空终止字符。