在C上将结构数组设置为NULL

时间:2015-11-10 17:46:58

标签: c

我写了这个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

3 个答案:

答案 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为每个工作人员的名称分配值,该名称负责处理空终止字符。