2016-01-03 4 views
0

Je cette partie du code:C++ accès variable struct provoque une erreur de segmentation

int connectingSocket,port; 
struct sockaddr_in server_address; 
struct hostent *server; 
server = gethostbyname("localhost"); 
if(server = NULL) 
    dataFile << "Error finding a host!" << std::endl; 
port = 7017; 
connectingSocket = socket(AF_INET,SOCK_STREAM,0); 
if(connectingSocket < 0) 
    dataFile << "Error opening a socket" << std::endl; 
memset(&server_address,0,sizeof(server_address)); 
server_address.sin_family = AF_INET; 
server_address.sin_port = htons(port); 
memcpy(&(server_address.sin_addr.s_addr), server->h_addr_list,server->h_length); 

Je suis sûr que la dernière ligne lance erreur Segmentation fault (core dumped), mais je ne suis pas sûr de ce que le problème est. J'ai essayé d'imprimer les tailles des variables.

std::cout << sizeof(server_address.sin_addr.s_addr) << " - " << sizeof(server->h_addr_list) << std::endl; 

Cette ligne imprime "4 - 8", les résultats ne devraient pas être les mêmes si je veux copier?

aussi:

std::cout << server->h_length << std::endl; 

Cette ligne provoque seule Segmentation fault.So Je crois que l'accès à cette variable provoque l'problem.I besoin de votre aide pour y remédier!

Merci d'avance!

+0

'if (server = NULL)' ce n'est pas une comparaison avec null. vous devriez utiliser == à la place. – Dominik

Répondre

1

incorrect if statememt:

if(server = NULL)

devrait être:

if(server == NULL)

Vous définissez server à NULL, et puis essayez de déréférencer un pointeur NULL.

Cependant, même si server était NULL, votre code continue et déréférence server de toute façon. Vous devriez contourner le code qui utilise server dans ce cas.

+0

Silly, que j'ai gaspillé 2 heures et je n'ai toujours pas remarqué^_^ – ESipalis

+0

Il n'a pas ignoré le code parce que quand je place le serveur à NULL, le serveur-> h_length isn ' t qu'est-ce que c'est censé être? – ESipalis

+0

Si 'server' est NULL, alors' server- >' est faux, puisque vous déréférencer un pointeur NULL. Mais le problème est que même si vous avez écrit le code correctement, et 'server' est revenu comme NULL, qu'a fait votre code? La seule chose à faire était d'imprimer un message, et ensuite? Il a utilisé 'server' de toute façon, comme s'il n'y avait pas eu d'erreur. – PaulMcKenzie