sendto()带有未初始化的char *缓冲区

时间:2014-03-06 19:54:23

标签: 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") ;
    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个元素分配内存。为什么不发送垃圾值?这是一个好奇心问题,但我更想知道这种情况。

由于

1 个答案:

答案 0 :(得分:1)

当您的循环退出时,i为512,因此thedata[i]指向thedata[]的末尾。我猜这被覆盖their_addr,特别是来自记忆的协议位于struct的头部。

请在此处插入关于您覆盖内存的事实的正常警告,因此行为未定义且任何事情都可能发生。