Второй memcpy () присоединяет к нему предыдущий массив memcpy () - PullRequest
2 голосов
/ 14 февраля 2011

У меня небольшая проблема с memcpy()

Когда я пишу это

char ipA[15], ipB[15];
size_t b = 15;
memcpy(ipA,line+15,b);

Копирует b байтов из массива line, начиная с 15-го элемента (хорошо, это то, что я хочу)

memcpy(ipB,line+31,b);

Копирует b байт со строки, начинающейся с 31-го элемента, , но , а также присоединяет к ней результат предыдущей команды, т.е.

Почему? ipB размер равен 15, поэтому на нем не должно быть достаточно места для копирования чего-либо еще. что здесь происходит?

  • результат для ipA равен 192.168.123.123
  • результат для ipB становится 205.123.123.122 192.168.123.123

Где я не прав? Я на самом деле не знаю много о распределении памяти в C.

Ответы [ 3 ]

6 голосов
/ 14 февраля 2011

Похоже, вы не завершаете строку в ipA.Компилятор поместил две переменные рядом друг с другом в память, поэтому строковые операции предполагают, что первый нулевой терминатор находится через некоторое время после второго массива (всякий раз, когда в памяти происходит следующее 0).1004 *

char ipA[16], ipB[16];
size_t b = 15;
memcpy(ipA,line+15,b);
ipA[15] = '\0';
memcpy(ipB,line+31,b);
ipB[15] = '\0';
printf("ipA: %s\nipB: %s\n", ipA, ipB)

Это должно подтвердить, является ли это проблемой.Очевидно, вы могли бы сделать код немного более элегантным, чем мой тестовый код выше.В качестве альтернативы ручному завершению вы можете использовать printf("%.*s\n", b, ipA); или аналогичный, чтобы заставить printf печатать правильное количество символов.

2 голосов
/ 14 февраля 2011

Проверяете ли вы содержимое массивов, выполняя printf("%s", ipA)? Если это так, вы получите описанный эффект, поскольку ваш массив интерпретируется как строка C, которая не заканчивается нулем. Сделайте это вместо: printf("%.*s", sizeof(ipA), ipA)

0 голосов
/ 14 февраля 2011

Символьные строки в C требуют завершающей метки.Это значение символа 0.

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

...