gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:53 25 4
gpt4 key购买 nike

我在使用以下代码时遇到错误,其中它会返回 sendto 失败,因为“协议(protocol)不支持地址族”。我在第 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 个元素分配内存。为什么它不发送垃圾值?这是一个比什么都好奇的问题,但我很想知道更多关于这种情况的信息。

谢谢

最佳答案

当循环退出时,i 为 512,因此 thedata[i] 指向 thedata[] 的结尾。我猜这会覆盖 their_addr,特别是内存中位于 struct 头部的协议(protocol)。

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

关于c - 带有未初始化的 char * 缓冲区的 sendto(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22234573/

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