C:赋值中不兼容的类型

我正在编写一个程序来检查端口是否在C中打开。特别是一行将其中一个参数复制到char数组中。 但是,当我尝试编译时,它说:

错误:赋值中的类型不兼容

inheritance人的代码。 错误在于addr的分配

 #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  int main(int argc, char **argv) { u_short port; /* user specified port number */ char addr[1023]; /* will be a copy of the address entered by u */ struct sockaddr_in address; /* the libc network address data structure */ short int sock = -1; /* file descriptor for the network socket */ port = atoi(argv[1]); addr = strncpy(addr, argv[2], 1023); bzero((char *)&address, sizeof(address)); /* init addr struct */ address.sin_addr.s_addr = inet_addr(addr); /* assign the address */ address.sin_port = htons(port); /* translate int2port num */ sock = socket(AF_INET, SOCK_STREAM, 0); if (connect(sock,(struct sockaddr *)&address,sizeof(address)) == 0) { printf("%i is open\n", port); } if (errno == 113) { fprintf(stderr, "Port not open!\n"); } close(sock); return 0; } 

我是C的新手,所以我不确定为什么会这样做。

addr是一个数组,因此您无法直接分配给它。

改变addr = strncpy(addr, argv[2], 1023); to strncpy(addr, argv[2], 1023);

返回指向您传入的内容的指针,但不需要此值。 单独调用strncpy会将字符串从argv[2]复制到addr


注意:我注意到有时你会传入数组的地址,有时你传入的数组本身没有运算符的地址。

当参数只询问char*

虽然两者都可以在addr传递而不是&addr更正确。 &addr给出一个指向char数组char (*)[1023]的指针,而addr给你一个char* ,它是第一个元素的地址。 它通常没关系,但如果你做指针运算,那么它将产生很大的不同。

您已经得到了几个答案,可以准确地解决您的问题。 我的建议是退后一步,消除这一步,因为它完全没必要。 我会更改这些行:

 u_short port; /* user specified port number */ char addr[1023]; /* will be a copy of the address entered by u */ struct sockaddr_in address; /* the libc network address data structure */ port = atoi(argv[1]); addr = strncpy(addr, argv[2], 1023); bzero((char *)&address, sizeof(address)); /* init addr struct */ address.sin_addr.s_addr = inet_addr(addr); /* assign the address */ address.sin_port = htons(port); /* translate int2port num */ 

这样的事情:

 struct sockaddr_in address = {0}; address.sin_port = htons(atoi(argv[1])); address.sin_addr.s_addr = inet_addr(argv[2]); 

现有代码正在进行大量不必要的复制,使代码更大更慢,而无需完成任何操作。

编辑:再看一遍,你应该添加一些错误检查代码(在上面的内容之前),例如:

 if (argc != 3) { fprintf(stderr, "Usage: %s  
", argv[0]); return EXIT_FAILURE; }

这条线

 addr = strncpy(addr, argv[2], 1023); 

应该是公正的

 strncpy(addr, argv[2], 1023); 

请注意,如果达到1023限制,则strncpy不会终止,因此您也应该这样做

 addr[1023] = `\0`; 

虽然我认为代码中还有其他假设。

另一种方法是使用char *代替:

 char *addr; addr = strdup(argv[2]); 

strdup基本上是一个执行malloc和strcpy的快捷方式,您不必担心addr的大小。 一旦完成,不要忘记免费添加。
请注意,如果argv [2]为NULL,您将获得段错误。