2014-03-06 33 views
1

我有一個錯誤,下面的代碼,其中它會返回給我,發送失敗,因爲「地址家庭不支持的協議」。我在第三行發現了我的錯誤,在for循環聲明後留下了分號。一旦我刪除了這個,一切正常。sendto()與未初始化的字符*緩衝區

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

向我們展示更多關於'their_addr'。在哪裏分配它,如何初始化它等。 – cnicutar

+0

已添加。似乎abligh是正確的,for循環導致我訪問錯誤的內存位置。 – IMerin

回答

1

當您退出循環,i是512,所以thedata[i]點超出thedata[]結束。我猜這覆蓋their_addr,特別是從內存中的協議在struct頭。

請在此處插入有關您覆蓋內存的事實的正常警告,以確保行爲未定義,並且可能發生任何事情。

+0

那很簡單。所以,儘管分號錯誤,括號內的代碼仍然會執行?我不知道。在將循環變量的長度設置爲511時,儘管出現錯誤,但代碼仍按預期執行。 – IMerin

+1

是的。如果你在'{}'中的塊沒有被'for',''while','if'或者其他任何東西所保護,它就會運行一次。 – abligh

+0

......好吧,和塊外面的數量完全一樣。 – abligh