Вы не производите выделение памяти для ddj
. Поскольку это локальная переменная, она выделяется в стеке. Локальные переменные по умолчанию не инициализируются до 0/false/NULL, поэтому значение ddj
сразу же после его объявления не определено - оно будет иметь значение того, что осталось в памяти в этом конкретном месте в стеке. Любая попытка разыменовать его (то есть читать или записывать память, в которой он указывает) будет иметь неопределенное поведение. В вашем случае это сбой, потому что это указывает на неверный адрес.
Чтобы устранить проблему, вам необходимо выделить хранилище для ddj
. Вы можете либо выделить статическое хранилище в стеке, либо динамическое хранилище в куче. Для выделения статической памяти, сделайте следующее:
// Allocate 64 bytes for ddj. It will automatically be deallocated when the function
// returns. Be careful of buffer overflows!
char ddj[64];
Чтобы выделить динамическую память:
// Allocate 64 bytes for ddj. It will NOT be automatically deallocated -- you must
// explicitly deallocate it yourself at some point in the future when you're done
// with it. Be careful of buffer overflows!
char *ddj = new char[64];
...
delete [] ddj; // Deallocate it
Вместо управления хранением себя, было бы лучше использовать std::string
, которая автоматически занимается управлением памятью.
Наконец, поскольку все, что вы делаете, сравнивает первые три символа строки, нет необходимости перепрыгивать через обруч, чтобы скопировать строку и сравнить ее. Просто используйте strncmp()
:
if(strncmp(buffer, "JMX", 3) == 0)
{
...
}
Если вы задали вопрос о том, что вы на самом деле пытались сделать, мы могли бы предоставить вам оптимальный и простой способ C++. Вы в настоящее время используете субоптимальный и, откровенно говоря, неправильный способ C сделать это. – 2009-05-17 17:43:51
Еще раз, когда дело доходит до явного управления памятью, большинство ответов технически неверны. Я считаю, что я считаю, что нужно использовать std :: vector или std:; string. – 2009-05-17 17:52:59