передающий символьный буфер к функциям и получению размера буфера

Во-первых, возьми ответ @ Bohemian, это то, что ты хочешь. и любые будущие гугл. Это не работает, потому что у вас есть ошибка: D (именно поэтому мы все приходим к переполнению стека, в зависимости от вашего определения ошибки)

SimpleEntry simpleEntry = new SimpleEntry ("", "");

...

actionMap.put (stringkey, simpleEntry entry );

это помогает?

11
задан ant2009 4 March 2009 в 04:49
поделиться

4 ответа

Вы используете размер указателя на буфер (4 байта), а не размер буфера.

В C необходимо передать размер буфера отдельно, который является частью причины, переполнение буфера происходит так легко и часто.

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}
22
ответ дан 3 December 2019 в 00:51
поделиться

Ответы Mitch Wheat и hhafez являются абсолютно правильными и к точке. Я собираюсь показать некоторую дополнительную информацию, которая может оказаться полезной иногда.

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

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Массив как параметр просто объявляет указатель. Компилятор автоматически изменяет это на char *name даже если это было объявлено как char name[N].

Если Вы хотите вынудить вызывающие стороны передать массив размера 100 только, можно принять адрес массива (и тип того) вместо этого:

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

Это - указатель на массив, который Вы имеете в основном, таким образом, необходимо разыменовать в функции для получения массива. Индексация затем сделана

buffer[0][N] or (*buffer)[N]

Никто, которого я знаю, не делает это, и я ни не делаю его сам, потому что это скорее усложняет передачу аргумента. Но хорошо знать об этом. Можно вызвать функцию как это затем

load_buffer(&buffer)

Если бы Вы хотите принять другие размеры также, я пошел бы с передающей-N опцией, которую рекомендуют другие два ответа.

21
ответ дан 3 December 2019 в 00:51
поделиться

От OP

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Даже при том, что можно вообразить это load_buffer() передается buffer ссылкой, что действительно происходит, Вы, передают указатель на char значением. Фактический массив не передается, таким образом, нет никакого пути к load_buffer() функция для знания размера буферного массива

Таким образом, что sizeof(buffer) выполнение? Это просто возвращает размер указателя для обугливания. Если load_buffer() нуждается в размере buffer это должно быть передано speratly.

Или можно создать новую структуру, которая содержит и массив символов и размер массива, и передайте указатель на ту структуру вместо этого, тот путь буфер, и это - размер, всегда вместе ;)

8
ответ дан 3 December 2019 в 00:51
поделиться

То, что происходит, когда Вы передаете массив функции, Вы только передаете адрес массива в памяти, не размер массива. То, что sizeof (буфер) производит в load_buffer () является размером указателя, который составляет четыре байта.

Лучший способ сохранить размер буфера в функции состоит в том, чтобы изменить функцию на:

void load_buffer(char *buffer, int length);

и вызов к:

load_buffer(buffer, sizeof(buffer));

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

4
ответ дан 3 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: