значение мусора при использовании malloc - PullRequest
4 голосов
/ 19 июля 2011

Мне нужно сравнить несколько символов строки, скажем, от 2-го символа до 4-го символа (отсчет начинается с нуля)
Строка хранится в элементах структуры, например, zoopla-> real
, например, zoopla -> real has'447889036' где real имеет тип char real [20];
Также обратите внимание, что я не могу использовать функцию strnstr.

Код работает, как и ожидалось, но просто для любопытства, я добавил оператор printf, и он показывает мне значение до 4 кара, а затем некоторые символы garabe.
Я хочу знать, почему в атрибуте printf отображаются 2 дополнительныхценности гарабе?

char * copyTemp;                   
char *strptr;           
copyTemp = (char *)malloc(sizeof(char)*6);           

strncpy(copyTemp, zoopla->real, 5);              
printf("the string copied is %s", copyTemp); // debug statemnt            
strptr = strstr(copyTemp, "666");           

if(strptr != NULL)              
{         
//some other function        
}        
else        
//some other function             
free(copyTemp);               

Любая критика и предложения приветствуются

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Мне кажется, что copyTemp не завершено нулем.Вот почему printf показывает вам символы мусора после символов, которые вы там вставили.Он не знает, где остановиться, поэтому продолжает перебирать память.

Добавить

copyTemp[5] = '\0';

после strncpy.

См. Этот пример из документации strncpy:

/* strncpy example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]= "To be or not to be";
  char str2[6];
  strncpy (str2,str1,5);
  str2[5]='\0';
  puts (str2);
  return 0;
}
2 голосов
/ 19 июля 2011

см http://www.cplusplus.com/reference/clibrary/cstring/strncpy/ Никакой нулевой символ не добавляется неявно в конец пункта назначения, поэтому пункт назначения будет заканчиваться нулем только в том случае, если длина строки C в источнике меньше чем num.

Вы должны добавить ноль себя.

если вы будете выделять память постоянного размера, используйте только массив.

 #include <stdio.h>
 #include <string.h>

int main ()
{
 char * copyTemp;                   
char *strptr;           
copyTemp = (char *)calloc(sizeof(char),6);           

strncpy(copyTemp, "88666782921", 5);              
printf("the string copied is %s", copyTemp); // debug statemnt            
strptr = strstr(copyTemp, "666");           

if(strptr != NULL)              
{         
//some other function        
}        
else        
//some other function             
free(copyTemp);        
return 0;  
}
1 голос
/ 19 июля 2011

Согласно моему старому K & R, strncpy будет неявно добавлять нулевые байты только в том случае, если в исходной строке меньше символов, чем число для копирования.

В этом случае zoopla->real содержит более 5 символов, поэтому функция просто копирует первые пять символов. Поскольку вы не инициализировали память нулем или не добавили явно нулевой байт, строка не заканчивается после пятого символа. Поэтому, когда вы печатаете строку, вы получаете дополнительные байты с практически случайными значениями, пока один из них не попадет в ноль.

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