无法访问数组元素?

时间:2013-02-27 07:48:13

标签: c

我有这个数组,我试图通过递增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;

  }

2 个答案:

答案 0 :(得分: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 :(得分:-1)

请记住,虽然我们倾向于将双指针视为数组,但所有编译器都将它们视为指针。当您递增指针时,它会向指针的地址添加一个值,该值等于它指向的数据类型的大小。例如:

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

p指向int,因此p指向数据的大小(通常)为4个字节。这意味着当您递增p时,它将指向比以前大4个字节的位置。

arr的类型是char**,这意味着它是指向char的指针。这些天大多数机器上的指针是8个字节。因此,当您递增arr时,您实际上是在告诉计算机将arr设置为指向比以前高8个字节的地址。在arr的情况下,这是一个非法地址,所以你会遇到某种崩溃。