2013-10-26 3 views
1

Новый вопрос здесь ... почему следующий код работает только с массивом 1D, но не с 2D-массивом? Разве это не имеет значения, указывает ли b на начало 1D-массива или 2D-массив, если это указатель char * (как есть)? Я думал, что общая нотация [bound1] [bound2] была эквивалентной [bound1 * bound2], даже над операцией присваивания. Помогите?Невозможно преобразовать char (*) [50] в char * при назначении

main() //this works fine 
    { 
     char *b; 
     b = new char[50]; 
     return 0; 
    } 

.

main() //but this raises the error "Cannot convert char(*)[50] to char* in assignment" 
{ 
    char *b; 
    b = new char[50][50]; 
    return 0; 
} 
+1

Иногда это помогает, если вы будете искать SO - http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new – SChepurin

ответ

1

char[50]; является массив из 50 элементов типа char. Каждый элемент имеет тип char. Итак, new char[50]; возвращает указатель на первый элемент: char * - указатель на char.

char[50][50] НЕ массив из char. Это массив массивов. Каждый элемент имеет тип char[50]. Итак, new char[50][50]; возвращает указатель на первый элемент: char (*)[50] - указатель на char[50].

Declare b таким образом:

char (*b)[50]; 

Тест: http://ideone.com/1zJs1O

0

Если используемый были правы с этим [bound1] [bound2] и [bound1 * bound2] были эквивалентны вы бы не создали 2D-массив. Размер выделенной памяти, это то, что подразумевает ваше умножение, здесь не проблема, речь идет о разных типах данных: массив 1D - это просто не 2D-массив, и это то, что компилятор вам говорит. Вы должны прочитать о системе типа C++ и о безопасности.

What is type safety and what are the "type safe" alternatives?

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