2016-05-06 7 views
-1

Ich bekomme beim Kopieren der Zeichenkette seg Fehler. Ich habe Alternativen wie versucht, aber das gleiche Problem herrscht.Segmentierungsfehler beim Kopieren des Zeichenfolgenpuffers

#if 0 
     struct msghdr { 
       void *msg_name; /* Socket name */ 
       int msg_namelen; /* Length of name */ 
       struct iovec *msg_iov; /* Data blocks */ 
       __kernel_size_t msg_iovlen; /* Number of blocks */ 
       void *msg_control; /* Per protocol magic (eg BSD file descriptor passing) */ 
       __kernel_size_t msg_controllen; /* Length of cmsg list */ 
       unsigned int msg_flags; 
}; 
#endif 


void call(char sendString[]) 
{ 
    struct msghdr msg; 
    int rc; 
    struct sockaddr_in server_addr; 
    memset(&server_addr, 0 , sizeof(struct sockaddr_in)); 
    memset(&msg, 0 , sizeof(struct msghdr)); 
    msg.msg_name = (void *)&server_addr; 
    msg.msg_namelen = sizeof(struct sockaddr_in); 
    printf("sendString = %s\n", sendString); 
    //msg.msg_iov->iov_base = (void *)sendString; // seg fault here 
    memcpy(msg.msg_iov->iov_base, sendString, strlen(sendString)); // seg fault here 
    printf("len = %d\n", strlen(sendString)); 
    #if 0 
    msg.msg_iov->iov_len = strlen(sendString); 
    msg.msg_iovlen = 1; 
    msg.msg_control = NULL; 
    msg.msg_controllen = 0; 
    msg.msg_flags = 0; 
    #endif 
    printf("rc = %d\n", rc); 

}

int 
main(int argc, char **argv){ 
    char buff[32] = "Hello\0"; 
    call(buff); 
    return 0; 
} 

Ich habe versucht, die Fälle beide und Segmentation fault immer in beiden Linien:

msg.msg_iov->iov_base = (void *)sendString; 
memcpy(msg.msg_iov->iov_base, sendString, strlen(sendString)); 

Ihre Hilfe zu schätzen wissen.

Antwort

1

msg.msg_iov ist ein Zeiger und es ist kein Speicher für diesen Zeiger reserviert, und Sie versuchen, ihn zu dereferenzieren, was zu undefiniertem Verhalten führen wird.

Bevor ein memcpy() tun

tun
msg.msg_iov = malloc(sizeof(struct iovec)); 

Sie haben nicht gezeigt, um die struct iovec Definition so dass ich Mitglied annehmen iov_base innerhalb es genügend Platz hat die Saite (sendString) zu halten.

+0

Danke, ich habe diesen Punkt verpasst. –

+0

@AbhishekSagar NP ... – Gopi

Verwandte Themen