2013-02-27 103 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的情况下,这是非法地址,所以你会遇到某种崩溃。