2013-01-11 2 views
0

HI Я пытаюсь понять указатели и массив, а при просмотре видео на youtube я нашел этот пример, который я пытаюсь воссоздать самостоятельно. Ниже приведен код.присвоение значений дополнительным строкам в 2D-массиве в C

#include <stdio.h> 
#include <math.h> 
main() 
{ 
    int arr[][2]={{11,12},{21,22},{31,32},{41,42},{51,52}}; 
    int i,j; 
    arr[5][1]=61; 
    arr[5][0]=62; 
    arr[6][1]=71; 
    arr[6][0]=72; 
    arr[7][1]=81; 
    arr[7][0]=82; 
    for(i=0;i<=7;i++) 
    { 
     for(j=0;j<=1;j++) 
     { 
      printf("%d %d %u %u %d %d %d \n",i,j,arr[i],arr[i]+j,arr[i][j],*(*(arr+i)+j),*(arr[i]+j)); 
     } 
    } 
} 

, когда я выполняю код дает мне

 
0 0 3216856768 3216856768 11 11 11 
0 1 3216856768 3216856772 12 12 12 
1 0 3216856776 3216856776 21 21 21 
1 1 3216856776 3216856780 22 22 22 
2 0 3216856784 3216856784 31 31 31 
2 1 3216856784 3216856788 32 32 32 
3 0 3216856792 3216856792 41 41 41 
3 1 3216856792 3216856796 42 42 42 
4 0 3216856800 3216856800 51 51 51 
4 1 3216856800 3216856804 52 52 52 
5 0 3216856808 3216856808 0 0 0 
5 1 3216856808 3216856812 5 5 5 
6 0 3216856816 3216856816 72 72 72 
6 1 3216856816 3216856820 71 71 71 
7 0 3216856824 3216856824 82 82 82 
7 1 3216856824 3216856828 81 81 81 

почему ARR [5] [0] и обр [5] [1] не присваивается данное значение? где 5 и 0?

ответ

3

C не является магическим (или языком сценариев). Если вы создадите массив с 5 элементами, он будет содержать 5 элементов. Независимо от того, что вы делаете с этим, он не будет автоматически расширяться. И позже, если вы получите доступ к массиву из своих границ, это приведет к неопределенному поведению. Этот код может даже сбой.

Что вы должны сделать вместо этого либо объявить достаточно большой массив:

int arr[8][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 }, { 51, 52 } }; 

Позже вы можете назначить им правильно; или использовать динамически расширяемые массивы, используя стандартные функции управления памятью malloc() и realloc():

int **arr = malloc(sizeof(*arr) * 5); 
int i; 
for (i = 0; i < 5; i++) { 
    arr[i] = malloc(sizeof(**arr)); 
} 

и заполнить его один-на-один

arr[0][0] = 11; 
arr[0][1] = 12; 
// etc. 

Затем разверните его, когда он нужду:

arr = realloc(arr, sizeof(*arr) * 8); 
for (i = 5; i < 8; i++) { 
    arr[i] = malloc(sizeof(**arr)); 
} 

После этого вы можете безопасно использовать arr[5]...arr[7]. В этом последнем случае, однако, не забудьте указать free() все указатели, которые необходимо освободить после использования.

+0

Большое вам спасибо. – Anand

+0

Таким образом, либо задайте больший массив, либо выделите память перед назначением значений. – Anand

+0

@Anand Да, в значительной степени. –

Смежные вопросы