尝试初始化“员工”结构时收到警告消息

时间:2018-12-27 18:34:09

标签: c

获得以下警告消息:

database.c:15:19: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
  ptr->LastName[0] = NULL;
                   ^
database.c:16:26: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
  ptr->FirstMiddleName[0] = NULL;

                      ^

我尝试过几种不同的方式使用指针,但是我对它们的理解不是很好,也无法弄清楚如何避免这种情况。

#include <stdio.h>

int main() {
        struct employee {
                char LastName[30];
                char FirstMiddleName[35];
                float Salary;
                int YearHired;
        };

        struct employee employees[20];
        struct employee *ptr, person;
        ptr = &person;

        ptr->LastName[0] = NULL;
        ptr->FirstMiddleName[0] = NULL;
        ptr->Salary = -1;
        ptr->YearHired = -1;

        printf("%i", person.YearHired);
        printf("%s", person.LastName[0]);

        for(int i = 0; i < 20; i++) {
                employees[i] = person;
                //printf("%i\n", i);
        }

        printf("%c", employees[3].LastName[0]);
}

我想用初始值初始化一个由20个“员工”组成的数组,以便将数值设置为-1,并且字符串包含空字符作为第零个字符。 相反,我得到了以上警告,并且如果我将NULL分配替换为一个字母,则会显示“分段错误(内核已转储)”。

5 个答案:

答案 0 :(得分:3)

NULL是一个空指针常量,而不是空字符。使用:

ptr->LastName[0] = '\0';

答案 1 :(得分:2)

编译器警告消息很清楚,可以告诉您您在做什么错。在这里

ptr->LastName[0]  = NULL; /* NULL is equivalent of (void*)0 not \0 */

LastName[0]character,不是字符指针。您可能想要

ptr->LastName[0]  = '\0'; /* now here \0 and Lastname[0] both are of char type */

答案 2 :(得分:1)

NULL是一个指针常量,您正在尝试将其分配给./dist/main.jsresource字段的元素。而是将0分配给每个字符的第一个字符,这将使它们成为空字符串。

resource "alicloud_cs_managed_kubernetes" "k8s" {
  name = "${var.name}"
  availability_zone = "${data.alicloud_zones.main.zones.0.id}"
  new_nat_gateway = true
  worker_instance_types = ["${data.alicloud_instance_types.default.instance_types.0.id}"]
  worker_numbers = [2]
  password = "Test12345"
  pod_cidr = "172.20.0.0/16"
  service_cidr = "172.21.0.0/20"
  install_cloud_monitor = true
  worker_disk_category  = "cloud_efficiency"
  vswitch_ids = ["your-alibaba-vswitch-id"]
}

这也是无效的:

data "alicloud_zones" main {
  available_resource_creation = "VSwitch"

  zones = [
     {
       id = "..."
       local_name = "..."
       ...
     },
     {
       id = "..."
       local_name = "..."
       ...
     },
     ...
  ]
}

因为LastName是单个字符,而不是字符串。相反,您想要:

FirstMiddleName

答案 3 :(得分:1)

要解决警告,请使用空字符'\ 0'替换NULL。 NULL是一个指针,不是您想要的。

ptr->LastName[0] = '\0';

要解决细分错误,请在打印文件中用 person.LastName 替换 person.LastName [0] person.LastName [0] 是一个字符。 printf%s期望以空值结尾的字符串的地址。

printf("%s", person.LastName);

如果您没有在字符串中的某个地方放置空终止符,则该printf语句可能仍然会失败:

 ptr->LastName[0] = 'a';   //may still fail in printf without termination.

vs

ptr->LastName[0] = 'a';   
ptr->LastName[1] = '\0';  

答案 4 :(得分:0)

宏NULL是无效的指针,而不是ASCII NUL字符,您不应将其用作字符常量。 NUL字符为\0

    ptr->LastName[0] = `\0` ;
    ptr->FirstMiddleName[0] = `\0` ;

或者仅使用文字零也是有效的:

    ptr->LastName[0] = 0 ;
    ptr->FirstMiddleName[0] = 0 ;