Вопрос:

У strlen есть побочный эффект?

c++ c

184 просмотра

1 ответ

22 Репутация автора

Я знаю или, вернее, полагаю, что strlen () - довольно простая функция, но по какой-то причине, когда я хочу использовать ее в одной своей функции, она повредит программу. Я понятия не имею, почему это происходит, потому что результаты strlen верны, но программа в целом не работает, если включена strlen. Чтобы быть конкретным, эта часть кода вызывает проблемы:

int random1 = strlen(objectNameValue);
int random2 = strlen(PA_type_value);
int random3 = strlen(attributeValue);
printf("length of objectNameValue: %d, PA_type_value: %d, attributeValue: %d", random1, random2, random3);

Моя программа на самом деле является простым сервером LDAP, и я пытаюсь отправить некоторые данные - например, эти переменные (attributeValue), когда я помещаю эту часть кода в комментарии, она отлично работает. Но если я оставлю это там, отправленные данные не верны, и я действительно не знаю, как strlen может повлиять на них. Забавно, что strlen на самом деле печатает правильные результаты.

Чтобы указать чуть больше, все эти три переменные в strlen имеют тип char [] и все имеют / 0 в конце. Кто-нибудь может помочь?

Итак, после запроса в комментариях, вот более внимательный взгляд: в основном, очень минимальным образом, это то, что я делаю:

char message_out[1024];
bzero(message_out, 1024);
char objectNameValue[1024];
strcpy(objectNameValue,"cn=");
char PA_type_value[5] = {'u', 'i', 'd'};
strcat(Message_out, objectNameValue);
strcat(Message_out, PA_type_value);

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

Вывод такой:

Длина objectNameValue: 12, PA_type_value: 3, attributeValue: 8

Автор: Martin Rešovský Источник Размещён: 08.11.2017 10:12

Ответы (1)


1 плюс

808 Репутация автора

Проблема может быть в том, как strlenнайти длину. strlenперебирает все символы массива символов, пока не найдет символ терминала \ 0. Если массив не имеет этого терминального символа, реализация может выйти за пределы памяти массива символов, который вы ему дали, и вызвать неопределенное поведение.

Автор: Valentin Размещён: 08.11.2017 10:15
Вопросы из категории :
32x32