2013-02-27 2 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

+0

По соображениям безопасности и хорошей практике программирования p1-p4, а также arr, должны быть объявлены как' const'. – Lundin

ответ

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 «s является (обычно) 4 байта. Это означает, что при добавлении p он будет указывать на местоположение на 4 байта больше, чем раньше.

Тип arr - char**, что означает его указатель на указатель на char. Указатели на большинстве машин в настоящее время составляют 8 байтов. Поэтому, когда вы увеличиваете arr, вы фактически сообщаете компьютеру, чтобы установить arr, чтобы указать на адрес на 8 байтов выше, чем раньше. В случае arr это незаконный адрес, поэтому вы получите какой-то крах.