Кажется, что массив символов растет после memcpy (), в чем проблема? - PullRequest
1 голос
/ 09 февраля 2010

Я использую char [] размера 4, но когда я использую функцию memcpy (), в ней хранится 8 символов, а также длина массива символов становится 8. Что происходит?

Я не хочу использовать malloc ok.

char strRoh[4]={'\0'};

, а затем

memcpy(strRoh,Dump+22,4);

Теперь скажите мне, что не так с этим

char strIP[]="hhhhhhhh";
char strRoh[4]={'\0'};
char strTheta[4]={'\0'};
char strTimeStamp[6]={'\0'};
char strNMDump[48]={'\0'};  

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

что, черт возьми, происходит с этим

Ответы [ 5 ]

6 голосов
/ 09 февраля 2010

C-строки являются 0-концевыми. Это означает, что если вы хотите иметь строку длиной n в C, вам нужно n+1 char s для нее:

char hello[5] = "hello";

не является строкой, потому что hello имеет место для 5 char с и не заканчивается 0.

char hello[6] = "hello";

является строкой и имеет 6 символов: h, e, l, l, o, 0.

Чтобы иметь возможность использовать функции, связанные со строками в C, вам нужен завершающий 0.

Итак, измените свой код так:

char strRoh[5]={'\0'};
char strTheta[5]={'\0'};
char strTimeStamp[7]={'\0'};
char strNMDump[49]={'\0'};

Обратите внимание, что в C, когда вы делаете:

char hello[] = "hello";

компилятор выполняет подсчет за вас и создает hello массив размера 6 (один завершающий 0):

printf("%zu\n", sizeof hello);

напечатает 6.

3 голосов
/ 09 февраля 2010

Базовый тип объектов, на которые указывают указатель источника и назначения, не имеет значения для memcpy; Результатом является двоичная копия данных.

Функция не проверяет наличие завершающего нулевого символа в источнике - она ​​всегда копирует ровно num байтов. Я предполагаю, что вы не добавляете завершающий ноль и не пытаетесь получить к нему доступ в виде строки.

1 голос
/ 09 февраля 2010

C не имеет какой-либо проверки границ для своих типов данных.

Так что вы, вероятно, «видите» при отладке кода, что он показывает вам 8 байтов в массиве. Как кто-то еще говорит, вы можете пытаться просмотреть его как строку и не иметь завершающего нулевого байта. Это вполне нормально в Си, и это один из аспектов языка, который делает его очень трудным для понимания.

Я могу порекомендовать вам прочитать хорошее введение в обработку памяти и указателей в C или переключиться на управляемый язык, такой как C #, VB.NET, Java, Perl, Python и т. Д.

0 голосов
/ 09 февраля 2010

Проблема в том, что у вас есть массив символов 4 байта, и вы записываете полные 4 байта во время memcpy, не оставляя места для завершающего нулевого символа.Объявите ваш массив как 5 байтов и инициализируйте все это как ноль (что вы уже делаете), и все должно быть в порядке.

0 голосов
/ 09 февраля 2010

Я полагаю, что если char имеет 2 байта, если вы записали memcpy в массив байтов, вы можете получить 8 байтов, то есть 2 байта для каждого символа.

Я, однако, заржавел в этих вещах C / C ++. Так что, надеюсь, кто-то с большим опытом даст вам лучший ответ.

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