以下を実行すると、GDBはそれがdata()
の最後の行で失敗だと言う:この関数呼び出しがうまくいかない理由はありますか?
Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: 13 at address: 0x0000000000000000 0x00000001000021ee in data (srvr=Cannot access memory at address 0x6567612d726572fd ) at /Users/Documents/w11/cs176b/mftp/data.c:121
は、あなたがそれが失敗する理由はどのような理由を参照していますか?
グローバルcontrol.cで、最終的にstrcpy()
はcontrol.c
data(passive_ip, passive_port);
data.c
void data(char* srvr, int prt) {
printf("In Data: connecting to %s:%i", srvr, prt);
struct hostent *hp = gethostbyname(srvr);
if (hp == NULL) {
printf("gethostbyname() failed\n");
} else {
printf("%s = ", hp->h_name);
unsigned int i=0;
// while (hp -> h_addr_list[i] != NULL) {
printf("%i %s ",i, inet_ntoa(*(struct in_addr*)(hp -> h_addr_list[0])));
// i++;
// }
printf("\n");
}
char hostname[15];
strcpy(hostname, inet_ntoa(*(struct in_addr*)(hp -> h_addr_list[0])));
int sockfd;
int len;
struct sockaddr_in address;
int result;
char* buffer;
/* Create a socket for the client. */
sockfd = socket(PF_INET, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr( hostname );
address.sin_port = htons(prt);
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops (data): client3");
exit(1);
}
read(sockfd, buffer, MY_BUFFER_SIZE);
} // this is line 121
多分 'データ()'関数がスタック –
を胸像ようGDBは、それがデータの最後の行で失敗だと言うサウンド:理由:アドレスの13:データ内0x0000000000000000 0x00000001000021ee(SRVRは=アドレスのメモリにアクセスできませんが を0x6567612d726572fd) /Users/brian/Documents/w11/cs176b/mftp/data.c:121 ... "srvr"は関数のパラメータです... hmmm –
あなたが投稿したコードは確かにありません問題の診断に役立ちます。最初の反復で失敗した場合は、data()内にあることは間違いありません。 –