C: tipos incompatibles en la asignación

Estoy escribiendo un progtwig para verificar si un puerto está abierto en C. Una línea en particular copia uno de los argumentos a una matriz de caracteres. Sin embargo, cuando bash comstackr, dice:

error: tipos incompatibles en la asignación

Aquí está el código. El error está en la asignación de 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; } 

Soy nuevo en C, así que no estoy seguro de por qué haría esto.

addr es una matriz, por lo que no se le puede asignar directamente.

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

Se devuelve un puntero a lo que pasó, pero este valor no es necesario. Solo la llamada a strncpy copiará la cadena de argv[2] a addr .


Nota: algunas veces pasa que ingresa la dirección de su matriz y otras veces que ingresa la matriz sin la dirección del operador.

Cuando el parámetro solo pide char*

A pesar de que ambos funcionarán, el paso en addr en lugar de &addr es más correcto. &addr le da un puntero a un carácter char array char (*)[1023] mientras que addr le da un char* que es la dirección del primer elemento. Por lo general no importa, pero si haces aritmética de punteros, entonces hará una gran diferencia.

Recibió un par de respuestas que abordan exactamente lo que pidió. Mi consejo sería dar un paso atrás y simplemente eliminar ese paso, ya que es completamente innecesario. Me gustaría cambiar estas líneas:

 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 */ 

a algo como esto:

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

El código existente está haciendo una gran cantidad de copias innecesarias, haciendo que el código sea más grande y más lento sin lograr nada.

Edición: mirándolo de nuevo, probablemente debería agregar un poco de código de comprobación de errores (antes de lo que está arriba), algo como:

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

La línea

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

debería ser justo

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

tenga en cuenta que strncpy no termina en nulo si se alcanza el límite de 1023, por lo que también debería tener

 addr[1023] = `\0`; 

aunque supongo que también hay otras suposiciones en el código.

una alternativa es usar un char * en su lugar:

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

strdup es básicamente un acceso directo que hace un malloc y un strcpy, y no tienes que preocuparte por el tamaño de addr por adelantado. No olvides liberarte una vez que hayas terminado.
Tenga en cuenta que si argv [2] es NULL obtendrá un error de seguridad.