2013-02-11 45 views
0

指針問題我有以下的C代碼:與C的相同指針不同的事情

int main(int argc, char *argv[]) 
{ 

    int n = argc - 1; 
    int array[n]; 
    int m[n][n]; 

    int i = 0; 
    for(i = 1; i<=n;i++) 
    {  
      array[i] = atoi(argv[i]); 
      printf("%d\n",array[i]); 
    } 
    printf("array[4] = %d\n",array[4]); 
    for(i = 1; i<=n;i++) 
    { 
      m[i][i] = 0; 
      printf("address of m[i][i] = %p\n",&m[i][i]); 
    } 

    printf("value of array[4] =%d pointer = %p\n",array[4],&array[4]); 

    for(i=1;i<=n;i++) printf("After %d\n",array[i]); 

    return 0; 
} 

如果我用下面的命令運行:」 ./program 30 35 15 5 10 20 15" 的輸出是:

30 
35 
15 
5 
10 
20 
25 
array[4] = 5 
address of m[i][i] = 0xbf93070c 
address of m[i][i] = 0xbf93072c 
address of m[i][i] = 0xbf93074c 
address of m[i][i] = 0xbf93076c 
address of m[i][i] = 0xbf93078c 
address of m[i][i] = 0xbf9307ac 
address of m[i][i] = 0xbf9307cc 
value of array[4] =0 pointer = 0xbf9307cc 
After 30 
After 35 
After 15 
After 0 
After 10 
After 20 
After 25 

注意數組[4]與m [n] [n]具有相同的指針。我真的不明白這是如何可能的。代碼有什麼問題。爲什麼array [4] = m [n] [n]?

+0

你意識到你的數組索引超出了範圍嗎? – 2013-02-11 00:35:24

回答

1

你的循環是錯誤的,在C數組是從零開始的。意思是第一個元素是a[0],最後一個是a[N-1],其中N是數組的大小。

此:

for(i = 1; i <= n; i++) 

應該是這樣的:

for(i = 0; i < n; i++) 

否則,你超越了數組boundries。

請注意,您正在使用VLA,但未指定C99標記。確保你知道你在做什麼。

+0

真實的故事!我應該注意到了!謝謝! – 2013-02-11 00:45:05

1
for(i = 1; i<=n;i++) 
{ 
     m[i][i] = 0; 
     printf("address of m[i][i] = %p\n",&m[i][i]); 
} 

您已覆蓋未預留給m的空間;

我應該去從0到n-1

for(i = 0 ; i < n ; i++) 
{ 
     m[i][i] = 0; 
     printf("address of m[i][i] = %p\n",&m[i][i]); 
}