获得以下警告消息:
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分配替换为一个字母,则会显示“分段错误(内核已转储)”。
答案 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.js
或resource
字段的元素。而是将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 ;