gpt4 book ai didi

c - 这个函数调用不工作有什么原因吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:06 26 4
gpt4 key购买 nike

当执行以下命令时,GDB 表示它在 data() 的最后一行失败:

Program received signal EXC_BAD_ACCESS, Could not access memory.Reason: 13 at address: 0x00000000000000000x00000001000021ee in data (srvr=Cannot access memory at address 0x6567612d726572fd ) at /Users/Documents/w11/cs176b/mftp/data.c:121

您是否看到它会失败的任何原因?

control.c 中的全局变量,最终得到 strcpy() 的 IP 地址 x.x.x.x

char passive_ip[25] = ""; 

在 control.c 中调用

data(passive_ip, passive_port); 

数据.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

最佳答案

我要做的第一是改变:

char hostname[15];

到:

char hostname[16];

您很可能会溢出缓冲区,这会导致堆栈损坏。完整的 IPv4 地址需要 16 个字符:nnn.nnn.nnn.nnn 加上终止符 \0。实际上,如果您对处理 IPv6 有一点兴趣,您可能不应该使用这些调用——我敢肯定它们在那个世界中表现不佳。但这是一个不同的问题。


你遇到的其他问题(这几乎肯定是你崩溃的原因)是你做的:

char *buffer;
:
read(sockfd, buffer, MY_BUFFER_SIZE);

没有实际为该缓冲区分配内存,因此 buffer 将指向某个任意位置。要么使用:

char buffer[MY_BUFFER_SIZE];

或:

char *buffer = malloc (MY_BUFFER_SIZE);

记得检查分配失败并在不再需要时释放它。

关于c - 这个函数调用不工作有什么原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com