我在下面的代码中出错了,其中sendto会因为“协议不支持地址族”而返回给我。我在第3行意识到我的错误,在for循环声明后留下了分号。一旦我删除了它,一切正常。
struct sockaddr_in their_addr;
if ((numbytes=recvfrom(sockfd, buf, 512, 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1 ) {
perror("recvfrom") ;
exit(1) ;
}
char thedata[512];
int i;
for (i = 0; i < 512; i++);
{
thedata[i] = 'a';
}
unsigned int addr_len = sizeof(struct sockaddr);
if ((numbytes=sendto(sockfd, thedata, 512, 0, (struct sockaddr *)&their_addr,
addr_len)) == -1 ) {
perror("sendto") ;
exit(1) ;
}
我的问题是为什么这条消息特别归还给我。我发送了一个带有未初始化值的数组,但我的假设是因为char数组被初始化为具有512个元素,所以它将为一行中的所有512个元素分配内存。为什么不发送垃圾值?这是一个好奇心问题,但我更想知道这种情况。
由于
答案 0 :(得分:1)
当您的循环退出时,i
为512,因此thedata[i]
指向thedata[]
的末尾。我猜这被覆盖their_addr
,特别是来自记忆的协议位于struct
的头部。
请在此处插入关于您覆盖内存的事实的正常警告,因此行为未定义且任何事情都可能发生。