Указатель меняет размер при вызове функции (проверяется с помощью GDB) - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть программа, которая передает символьный указатель, и функция, которой он передается, заполняет его строками. Однако я заметил, что данные были усечены. После исследования с использованием gdb кажется, что есть разница в размерах указателей.

int main(void) {
    unsigned char *test_char;

    test_char = (unsigned char *)malloc(sizeof(unsigned char) * 6);
    memset(test_char, 0x00, sizeof(unsigned char) * 6);

    functionToPopulate(test_char);
}

void functionToPopulate(unsigned char *test_char) {
    snprintf(test_char, sizeof(test_char), "%u%s%u", 20, ":", 30);
}

В этой ситуации я использовал gdb перед memset и напечатал значение test_char. Это говорит (6). Во время и после snprintf я снова использовал gdb для вывода значения test_char. Это говорит (4). Однако по возвращении значение снова говорит (6). Однако данные уже были усечены. Вместо «20:30» оно становится «20:».

1 Ответ

1 голос
/ 17 февраля 2012

Перед вызовом functiontopopulate вы вызываете malloc sizeof(unsigned char) * 6, который возвращает 6 sizeof (unsigned char) равен 1 * 6 = 6. Внутри функции вы вызываете sizeof (test_char), который является размером (unsigned char *)размер указателя равен 4. Когда вам нужно передать массив в c, вы всегда должны передавать размер массива, так как c не поддерживает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...