C 带有非斜体字符*缓冲区的sendto()

C 带有非斜体字符*缓冲区的sendto(),c,sockets,C,Sockets,我在下面的代码中有一个错误,它会返回给我sendto失败的消息,因为“协议不支持地址族”。我在第3行意识到了我的错误,在for循环声明后留下了分号。一旦我去掉这个,一切都很好 struct sockaddr_in their_addr; if ((numbytes=recvfrom(sockfd, buf, 512, 0, (struct sockaddr *)&their_addr, &addr_len)) == -1 ) { perror("recvfrom

我在下面的代码中有一个错误,它会返回给我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) ;
    }
struct sockaddr\u在其地址中;
如果((numbytes=recvfrom)(sockfd,buf,512,0,
(结构sockaddr*)及其地址(&addr_len))=-1){
perror(“recvfrom”);
出口(1);
}
字符数据[512];
int i;
对于(i=0;i<512;i++);
{
数据[i]=“a”;
}
unsigned int addr_len=sizeof(struct sockaddr);
如果((numbytes=sendto(sockfd,thedata,512,0,(struct sockaddr*)及其地址,
地址(1){
perror(“sendto”);
出口(1);
}
我的问题是,为什么这条信息被明确地返回给我。我发送了一个带有未初始化值的数组,但我的假设是,因为char数组被初始化为有512个元素,所以它将为一行中的所有512个元素分配内存。为什么它不发送垃圾值?这是一个好奇的问题,但我想知道更多关于这种情况的情况


谢谢当循环退出时,
i
是512,因此
数据[i]
指向
数据[]
的末尾之外。我猜这是重写了
他们的_addr
,特别是来自内存的协议,它位于
结构的头部


请在此处插入正常警告,说明您过度编写了内存,因此行为未定义,任何事情都可能发生。

向我们展示有关
他们的地址的更多信息。在哪里分配,如何初始化等等。添加了它。看起来好像abligh是对的,for循环导致我访问了错误的内存位置。当时非常简单。所以尽管有分号错误,括号内的代码仍然会执行?我不知道。将循环变量的长度设置为511后,尽管出现错误,代码仍按预期执行。是。如果
{}
中的块不受
for
while
If
或其他任何程序的保护,它将只运行一次。。。。嗯,和街区外的次数完全一样。