2013-02-27 107 views
-1

我有這個陣列,我試圖通過增加ptr來訪問它的元素,這裏建議 Trying to find different methods of accessing array elements? ...我一定在做一些愚蠢的事情......請幫助我!無法訪問數組元素?

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    int i; 

    char *p1 = "Cnversions"; 
    char *p2 = "Divided"; 
    char *p3 = "Plain"; 
    char *p4 = "Solid"; 

    char *arr[3]; 

    arr[0] = p1; 
    arr[1] = p2; 
    arr[2] = p3; 
    arr[3] = p4; 



    for(i=0;i<=3;i++) 
    { 

     printf("string at arr[%d] is: %s\n",i,*arr); 

    arr++; 
    } 

    return 0; 

    } 
+0

不要增加'arr'。 'arr'的大小應該是4. – squiguy 2013-02-27 07:49:39

+0

出於安全原因和良好的編程習慣,p1到p4以及arr應該聲明爲'const'。 – Lundin 2013-02-27 07:57:44

回答

5

arr陣列位於內存中的特定地方,所以它是沒有意義遞增arr(這是什麼意思遞增一個數組?)

相反,你將需要創建一個指向數組的起點和遞增指針:

char **ptr = arr; 
for(i=0; i<4; i++) { 
    printf("arr[%d] = %s\n", i, *ptr); 
    ptr++; 
} 

(另請注意,你需要做arr四個要素大,即char *arr[4] ,以容納你放入的四個字符串指針。)

-1

請記住,雖然我們傾向於將雙指針看作數組,但所有編譯器都將它們視爲指針。當您增加一個指針時,它會爲指針的地址添加一個值,該值等於它所指向的數據類型的大小。例如:

int *p; 
p = (int *) malloc(sizeof(int)); 

p指向一個int,所以p的尖的數據的大小是(通常)4個字節。這意味着當您增加p時,它將指向比以前位置大4個字節的位置。

arr的類型是char**,這意味着它是指向指向char的指針。目前大多數機器上的指針都是8個字節。所以當你遞增arr時,你正在有效地告訴計算機設置arr指向比以前高8個字節的地址。在arr的情況下,這是非法地址,所以你會遇到某種崩潰。