Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > указатели и массив строк


Автор: 12usver12 7.3.2009, 10:16
Код

void Add(char** mass );
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) 
{
char* mass[15];

Add(mass);

if (mass[2]!="")// почему здесь не работает проверка и такая тоже ?(mass[2]!=NULL)
MessageBox(0,mass[2],"info",0);//соответственно прога здесь слетает
return 0;
}

void Add(char** mass ) 
{
    mass[0] = "first record";
    mass[1] = "second record";
} 

собсно хочу использовать массив строк, но без использования векторов и дополнит структур, а именно таким способом,
объясните как мне правильно делать проверку пустой указатель или нет, там где в моем коде комментарий, корректно ли так вообще и какими проблемами сулит использование такой конструкции ? 

Автор: Anikmar 7.3.2009, 10:37
Цитата(12usver12 @  7.3.2009,  10:16 Найти цитируемый пост)
char* mass[15];
Add(mass);


Вы объявляете массив указателей на char,
Затем (не выделив память ни под один указатель) передаете его в функцию и там пытаетесь добавить в неинициализированный массив. Вот и вылет.
Сначала выделите память под мамассив:
mass = (char**)malloc(15, sizeof(char*)); (надеюсь ничего не попутал - посмотрите хелп по этой функции)

Добавлено через 2 минуты и 14 секунд
Цитата(12usver12 @  7.3.2009,  10:16 Найти цитируемый пост)
if (mass[2]!=""

Это со строками не работает! Используйте строковые функции - такие как strcmp, strncmp

Вы какую литературу читали? По идее эти вопросы как правило подробно освещаются.

Автор: 12usver12 7.3.2009, 10:55
может я не прав но разве это могло решить проблему,  так это локальная переменная при malloc в куче выделяется, но смысл остается тот же if (mass[2]!="")    при отладке mass[2] содержит 0xcccccccc мне это нужно как то сравнивать типа там INVALID PTR или еще что-то такое, если такое возможно...то есть логика программы например нужно перечислить названия процессов и занести в этот массив, размер которого берется с запасом плюс с проверкой не выхода за границы массива, при обработке этого массива интересует перебор колва валидных записей в этом массиве  

Автор: Anikmar 7.3.2009, 11:16
Цитата(Anikmar @  7.3.2009,  10:37 Найти цитируемый пост)
Цитата(12usver12 @  7.3.2009,  10:16 )
char* mass[15];
Add(mass);


Вы объявляете массив указателей на char,
Затем (не выделив память ни под один указатель) передаете его в функцию и там пытаетесь добавить в неинициализированный массив. Вот и вылет.
Сначала выделите память под мамассив:
mass = (char**)malloc(15, sizeof(char*)); (надеюсь ничего не попутал - посмотрите хелп по этой функции)

Я аидимо не проснулся - полную ерунду написал  smile 

Все у вас нормально с выделением памяти, вам просто начальную инициализацию массива надо сделать и все

Добавлено через 5 минут и 37 секунд
Предложение 1:
Если пробегаете по массиву строк начиная с первого уэлемента - то установите значение NULL как признак окончания списка строк, например так: 
Код

void Add(char **Mass)
{
    Mass[0] = "first string";
    Mass[1] = "second string";
    Mass[2] = NULL;
}


Другой способ - перед началом работы сразу обнулите массив так:
Код

for (i=0;i<15;i++) Mass[i] = NULL;


или при помощи функции memset (этот способ мне не нравится - так как я не уверен, что NULL и 0 одно и то же)

Автор: TiKKi 7.3.2009, 11:26
Цитата(Anikmar @ 7.3.2009,  11:16)
Я аидимо не проснулся - полную ерунду написал  smile

Ага. smile
Код

char* mass[15] = { 0 };

Еще как вариант инициализации.

Автор: Anikmar 7.3.2009, 11:33
Цитата(TiKKi @  7.3.2009,  11:26 Найти цитируемый пост)
Еще как вариант инициализации. 

ага. Я совсем забыл статические массивы... 

Автор: zim22 7.3.2009, 11:42
Цитата(12usver12 @  7.3.2009,  10:55 Найти цитируемый пост)
и занести в этот массив, размер которого берется с запасом 

может вам динамически создавать массив? тогда и не нужно будет угадывать "запас". 

Автор: 12usver12 7.3.2009, 13:03
да теперь вроде ясненько...
динамически выделять на моем примере 
Цитата
то есть логика программы например нужно перечислить названия процессов и занести в этот массив

сулит двойным действием сначала перебрать процессы для подсчета кол-ва процессов, потом динамически выделить память, и потом еще раз пройтись по процессам чтобы добавить их имена в массив...
все-таки при работе с объемными данными лучше я так понял выделять в куче память чем в стеке ? 


Автор: zim22 7.3.2009, 13:16
Цитата(12usver12 @  7.3.2009,  13:03 Найти цитируемый пост)
сулит двойным действием

ок. тогда можно создать написать свой класс "Список"
И при каждой итерации добавляйте название процесса в  новый элемент списка.

Автор: 12usver12 7.3.2009, 13:49
писать свой класс думаю смысла нет vector есть уже, мне это для более простых операций... 
впринципе вопрос решен  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)