2016-01-07 2 views
1

У меня есть 2d массив и вам нужно скопировать один 1d-элемент в один массив. Я попытался дублировать свою проблему в приведенном ниже примере. Но ниже, например, даже не компилируется, gcc жалуетсяcopy 1d element 2d array

индексируются значение не является ни массивом, ни pointer`

на линии TwoDArray[9][99] = 99;, почему это? Я не совсем понимаю, любая помощь будет оценена!

int main(void) 
{ 
    int i = 0; 
    int* TwoDArray; 
    int DestArr[100] = {0}; 

    TwoDArray = calloc(10,sizeof(int*)); 
    for (i = 0; i < 10; i++) 
    TwoDArray[i] = calloc(100,sizeof(int)); 

    TwoDArray[9][99] = 99; 

    memcpy(DestArr, &TwoDArray[9],sizeof(int)*100); 
    printf("DestArr[99] %d\n",DestArr[99]); 


return 0; 
} 

EDIT1:

я по ошибке не объявить int** TwoDArray как указатель на указатель - после изменения этого, теперь он составляет безотказно, но значение в мой результат является 0 и я d ожидаете, что это будет 99 - почему это?

+1

int * не является двумерным массивом или указателем. –

+0

Обручи, ошибка в моем вопросе ... let mer edit, извините! – cerr

+1

изменить на 'int ** TwoDArray;' ... 'memcpy (DestArr, TwoDArray [9], sizeof (int) * 100);' – BLUEPIXY

ответ

1

В вашем коде TwoDArray является указателем, указателем на int.

Таким образом, распределение памяти должно выглядеть

TwoDArray = calloc(10,sizeof(*TwoDArray)); //i.e., sizeof(int) 

вместо

TwoDArray = calloc(10,sizeof(int*)); 

и TwoDArray[i] существ типа int, не нуждается в каком-либо malloc -ation, вообще.

Таким образом, вы можете использовать TwoDArray[i], если i находится в пределах границ.

TwoDArray[9][99] недействителен, так как TwoDArray[9] не является указателем, так или иначе.

Связанные, чтобы использовать оператор массива индекса,

postfix-expression [ expression ]

Одно из выражений должны иметь тип «» указатель для завершения типа объекта «», другое выражения должно иметь целочисленный тип, и результат имеет тип '' type ''.

В случае TwoDArray[9][99], TwoDArray[9], конечно, не указатель, чтобы завершить тип объекта.


Edit:

В случае, если вы используете

int** TwoDArray; 

и

TwoDArray[i] = calloc(100,sizeof(int)); 

то, что вам нужно изменить

memcpy(DestArr, &TwoDArray[9],sizeof(int)*100); 

к

memcpy(DestArr, TwoDArray[9],sizeof(int)*100); 
       ^^ 

, как TwoDArray[9]сам теперь указатель вас интересует, а не адрес указателя.

+0

Вы можете обманывать и обрабатывать его как указатель '(int *) (TwoDArray [9]) [99]'. Не рекомендуется – SGM1

+0

На самом деле, просто для аргументации, я бы сказал, что 'TwoDArray [9]' является указателем, который неправильно интерпретируется как общее число. – SGM1

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

  • Нет связанных вопросов^_^