2016-05-06 7 views
-1

文字列のコピー中にエラーが発生しました。私は同じような選択肢を試しましたが、同じ問題があります。文字列バッファのコピー中にセグメント化エラーが発生しました

#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; 
} 

私は両方のケースを試みたが、両方のラインでセグメンテーションフォールトを取得しています

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

はあなたの助けに感謝。

答えて

1

msg.msg_iovはポインタであり、このポインタに割り当てられたメモリがないため、逆参照しようとすると未定義の動作につながります。 memcpy()を行う前に

は、あなたはそれが文字列(sendString)を保持するのに十分なスペースを持っている内ので、私はメンバーiov_baseを想定struct iovec定義を示していない

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

を行います。

+0

ありがとう、私はその点を逃した。 –

+0

@AbhishekSagar np ... – Gopi

関連する問題