2012-03-15 3 views
0

Я действительно не уверен, что это (если это массив указателей или массив указательных массивов ???), но когда я нахожу его через Debugger, он дает мне 0xCDCDCDCD, то есть выделяется память, но неинициализированы. Может ли кто-нибудь показать мне, как его инициализировать?Как инициализировать этот массив указателей?

Спасибо.

char* (*vars)[4]; 

Я пробовал такие вещи, как это, но она дает ошибки компиляции:

for (int i = 0; i < 4; i++) 
    vars[i] = new char*[new char*][4]; // error C2440: 'initializing' : cannot convert from 'char **' to 'unsigned int' 
+6

Если вы не знаете, что это такое, почему вы пытаетесь его использовать? –

+3

Я думаю, что было бы более полезно сообщить нам, чего вы пытаетесь достичь, и позвольте нам помочь вам в этом. Мне сложно понять, что вы хотите сделать, чтобы это было правильным способом. –

+2

Это выглядит чрезвычайно сложным. – chris

ответ

7

Во-первых, вам нужно использовать cdecl:

объявить ВАР как указатель на массив 4 указатель на уголь

Как вы его инициализируете, зависит от вашей цели. Но, например,

// Create a new array 
vars = new (char *[1][4]); 
// Each element of the array in turn points to an array 
for (int i = 0; i < 4; i++) { 
    (*vars)[i] = new char[27]; 
} 

... 

// Cleanup 
for (int i = 0; i < 4; i++) { 
    delete [] (*vars)[i]; 
} 
delete [] vars; 

Наконец, вы никогда не должны писать такой код на C++. Всегда есть лучший способ сделать то, что вы пытаетесь сделать (обычно с участием контейнеров и интеллектуальных указателей).

+2

+1, именно то, что я собирался сказать, но вы избили меня до этого –

+0

Спасибо, все работает, кроме первой строки. Он говорит, ошибка C2440: '=': не может преобразовать из 'char **' в 'char * (*) [4]' – SoftwareGuy

+0

@SoftwareGuy: Хорошо, я исправил это. Мой пример был неправильным, потому что я никогда не использовал такие конструкции, поэтому я вышел из практики! –

2

vars - указатель на массив из 4 указателей на символ.

Вы можете не индексировать гнездо new в C++, так что вы должны сделать что-то вроде:

vars = new (char*)[4]; 
for(int i=0; i<4; i++) { 
    (*vars)[i] = ...; 
} 

Внутренняя часть цикла, инициализация указателей внутри этого массива, он сильно зависит от остальных вашей программы.

Но если вы начнете писать что-то вроде этого, какое бы лекарство вы ни находились, принимайте больше или меньше.

0

double (vars)[4]; просто объявляет массив из 4 двухместных. (Необязательные скобки просто запутывают). Если вам нужен массив из 4 строк, используйте char *((vars)[4]); (ОК, я вышел за борт с помощью скобок.) Затем вы можете инициализировать их нулевыми значениями или выделять новые строки или указывать их в предварительно распределенной памяти.

char *vars[4]; 
for (int i = 0; i < 4; i++) 
    vars[i] = new char[I_HOPE_THIS_IS_BIG_ENOUGH]; 
+0

Спасибо за альтернативу. Я делаю это, чтобы понять, насколько легко было бы адаптировать все к новой структуре. – SoftwareGuy

+0

Эта идея была действительно хороша. Я закончил с двухмерным массивом CString, где «I_HOPE_THIS_IS_BIG_ENOUGH» было установлено 100 позиций. На практике мы знаем, что мы не достигнем этого ... Спасибо за ваше предложение и помощь. – SoftwareGuy

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