Попытка избавиться от любого выделения памяти кучи - PullRequest
0 голосов
/ 15 февраля 2020

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

Я не могу использовать любую библиотеку, которая может мне помочь, это означает: <string> например.

Как я могу сделать это с использованием выделения памяти в стеке?

int main(void) {
    class Animal {
        unsigned char nameLength;
        unsigned char name[];

        setName(unsigned char name[]) {
            memcpy(this->name, name, this->length * sizeof(unsigned char));
        }
    }

    Animal dog;

    // The value '4' isn't constant, it depends on received data from socket
    dog.nameLength = 4;

    // Right now I know how many elements will be in dog.name array

    unsigned char randomName[dog.nameLength];

    // Here will be a for loop, but just for example:
    randomName[0] = "B";
    randomName[1] = "e";
    randomName[2] = "n";
    randomName[3] = "/0";

    dog.setName(randomName);

    // Expected output: dog.name = "Ben\0"
}

Форма для l oop будет выглядеть так:

unsigned char i;
for (i = 0; i < (dog.nameLength-1); i++) {
    randomName[i] = packet[i];
}
randomName[i] = 0;

1 Ответ

0 голосов
/ 15 февраля 2020

Ваш код имеет несколько проблем, разбейте его на несколько вопросов для каждой проблемы, с которой вы столкнулись.

Но для основной проблемы: в общем, делать то, что вы пытаетесь, очень плохая идея. do (динамическое выделение в стеке), это как раз то, для чего предназначены выделения в куче.

Кроме того, стандартный C ++ не допускает этого. Однако есть расширения компилятора, которые вы можете использовать: Почему в стеке нет массива переменного размера? и linux имеют alloca: http://man7.org/linux/man-pages/man3/alloca.3.html & C ++ Как выделить память динамически в стеке?

Но, опять же, не делайте этого, если вам действительно не нужно и вы не поймете, что делаете .

Также, пожалуйста, послушайте комментаторов о том, как задать вопрос, и приведите минимальный пример.

...