2012-06-05 70 views
1

我不明白爲什麼i設置爲0之後array被初始化爲0。不明白爲什麼變量i設置爲零?

程序工作正常,因爲我有reinitializedvalue of ki。 但我找不到爲什麼i變成0。 爲什麼memset()正在清除陣列,或將陣列設置爲0

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
int main() 
{ 
    long long int i = 123456789; 
    long long int j = 987654321; 
    long long int cnt = 0; 
    int array[9] ; 
    int xyz, k, x, rem, se; 
    xyz = 0; 

// printf("I = %llf", i); 
    for (i; (i < j) && (cnt < 100000); i++) 
    { 
     k = i; 
     x = 0; 
     for (se = 0; se <= 9; se++) 
     { 
      array[se] = 0; 
     } 

/*************************************************/ 

     i = k; // Here i becomes zero. Why? 

/************************************************/ 

     //memset(array, 0, 9); 

     while(k != 0) 
     { 
      rem = k % 10; 
      for(se = 0; se <= 9; se++) 
      { 
       if(rem == array[se]) 
       { 
        xyz = 1; 
        break; 
       } 

      } 
      if(rem == array[se]) 
       { 
        xyz = 1; 
        break; 
       } 
      array[x++] = rem; 
      k = k/10; 
     } 
     if (xyz != 1) 
     { 
      cnt++; 
     // printf("Cnt = %d ", cnt); 
     // printf("The value i is = %lld\n", i); 
     // Sleep(10); 
     } 
     xyz = 0; 
     // printf("The value i is = %lld\n", i); 
     // printf("Cnt = %d \n", cnt); 
     fflush(stdin); 
    } 
    printf("The value i is = %lld \n", i-1); 
    return 0; 
} 
+4

刷新'stdin'是未定義的行爲。 –

+0

'array'有9個內部位置,並且您正在訪問10:0..9(含)。然後,你還可以訪問'array [x]',而不是綁定'x'' –

回答

3

你有一個緩衝區溢出;由於緩衝區位於堆棧上,因此可能會將其視爲堆棧溢出的一種形式

int array[9]; // Elements array[0] .. array[8] 
... 

for (se = 0; se <= 9; se++) 
{ 
    array[se] = 0; 
} 

它必須是k正被與所述額外的0重寫; i被賦值爲0,因爲這是k中的值。當你在數組的邊界之外寫時,你會調用'未定義的行爲',就像你在這裏所做的那樣。未定義的行爲意味着任何事情都可能發生並且沒有問題。有時候,它似乎有效;有時候,會有意想不到的副作用。不惜一切代價避免「未定義的行爲」。

慣用for循環是:

for (se = 0; se < 9; se++) 
    array[se] = 0; 

注意<而不是<=

有些人會不同意。查看評論。


你也問了(註釋)調用memset()

//memset(array, 0, 9); 

的第三個參數memset()是在記憶的區域的字節大小進行設置。您在數組中總共(可能)36個字節中設置了9個字節,這不太可能是您想要的。

這裏,數組在同一個函數定義,因此它是安全和明智的寫:

memset(array, 0, sizeof(array)); 

如果array是傳遞給函數的參數,這將無法正常工作;你需要不同的尺寸。例如:檢查此

void somefunc(int array[], int num) 
{ 
    ... 
    memset(array, 0, num * sizeof(array[0])); 
    ... 
} 
+0

好吧,假設你的解釋被接受,但仍然爲什麼我變成0?你的意思是說數組[9]只不過是x的值? –

+0

@RasmiRanjanNayak數組索引超出範圍,行爲未定義。 (在這種情況下,我被改變到無法識別) – wildplasser

+0

沒有元素'數組[9]';有效的數組索引是「0」,「1」,...,「8」(小於數組的維數)。 C不是BASIC!數組中有9個整數;第一個是'array [0]',第二個是'array [1]',第八個是'array [7]',第九個也是最後一個是'array [8]'。當你訪問'array [9]'時,你正在訪問數組之外​​的內存;內存是**不是陣列的一部分。 'i'的值爲'0',因爲'k'的值爲'0'。它必須是在你的機器上使用你的編譯器,'k'在數組之後立即被存儲。但那是偶然的;不要依賴它。 –

2

您正在覆蓋數組的末尾。

int array[9] ; 

for(se = 0; se <= 9; se++) 
{ 
    array[se] = 0; 
} 

在C中,數組從0開始索引,所以循環向前走了一步。慣用的語法是:

for(se = 0; se < 9; se++) 

換句話說,使用與<元件作爲值的數目。常寫除去嚇人的數值不變,就像這樣:

for(se = 0; se < sizeof array/sizeof *array; se++) 

該自動使用sizeof運營商(在編譯時)計算元素的適當數量,因此,如果你改變了array定義循環保持正確

1

的一種方法是通過印刷& X檢查x和陣列[9]的指針數組& [9]

如果它們是相同的,那麼肯定會覆蓋上面提到的。

+0

是的,我肯定現在就試試這個。你是絕對正確的。 –

相關問題