sprintf возиться с моими указателями и данными? - PullRequest
0 голосов
/ 08 мая 2011
char purl[1024];
unsigned char * puMember;
unsigned char uMember;
puMember = &uMember;

unsigned char * pMember;
unsigned char Member;
pMember = &Member;

printf("member: %s\n",pMember);
printf("username :%s\n",puMember);
sprintf(purl, "Username: %s %s",puMember,pMember);
printf("URL:%s\n",purl);
printf("member: %s\n",puMember);
printf("username :%s\n",pMember);

выход

member: 12345678
username :User1
URL: username: cUser1 ser1
member: User1
username :ser1

Я запутался в том, почему sprintf портит мои указатели после того, как он был выполнен.

pMember имеет 12345678, а puMember имеет User1, я пытаюсь отформатировать их в строку (purl), но кажется, что sprintf испортил их: /

Любая помощь, как я мог бы сделать это?

Ответы [ 3 ]

1 голос
/ 08 мая 2011
char purl[1024];
unsigned char * puMember;
unsigned char uMember;

uMember имеет пробел для 1 символа; 'F' или '4' или '\0'

puMember = &uMember;

puMember указывает на этого персонажа. И этот символ один: размер объекта составляет 1 байт.

unsigned char * pMember;
unsigned char Member;

Member имеет пробел для 1 символа

pMember = &Member;

pMember указывает на 1 символ.

printf("member: %s\n",pMember);

Нет, нет, нет. pMember не указывает на «строку». Вы вызвали неопределенное поведение: все может случиться

printf("username :%s\n",puMember);

Нет, нет, нет. puMember не указывает на «строку». Вы вызвали неопределенное поведение: все может случиться

sprintf(purl, "Username: %s %s",puMember,pMember);

Нет, нет, нет. puMember и pMember не указывают на "string" s. Вы вызвали неопределенное поведение: все может случиться

printf("URL:%s\n",purl);
printf("member: %s\n",puMember);
printf("username :%s\n",pMember);

Нет, нет, нет ...

1 голос
/ 08 мая 2011

Ваш код очень странный - если pMember и puMember указывают на одинарные символы, почему printf их как строка с завершающим мул?Он будет печатать что угодно, пока не найдет ноль в памяти.

Аналогично, sprintf продолжит чтение памяти после символов Member и uMember и заполнит purl - в зависимости от того, когда он найдетнулевой байт в памяти.

Использование snprintf вместо printf позволит избежать переполнения буфера, но что именно вы пытаетесь достичь?

1 голос
/ 08 мая 2011

Вы где-то перезаписываете буфер.Замените sprintf на snprintf, чтобы библиотека C точно знала, сколько места у вас в целевом буфере, например:

char buffer[32];
snprintf( buffer, 32, "my text: %s\n", some_char_ptr );

Edit 0:

Строки в C заканчиваются нулем, что означает, что в конце фрагмента памяти есть один дополнительный байт со значением '\0', который сигнализирует об окончании строки.То, что библиотека C предполагает для строковых функций, таких как strlen и strcpy, и для %s спецификатора формата для всех printf s.В противном случае эти библиотечные функции будут выполняться в памяти до тех пор, пока не будет найден байт с нулевым значением или ОС не убьет вашу программу для доступа к неотображенной памяти.

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