使用malloc时的垃圾值

时间:2011-07-19 11:28:40

标签: c malloc

我必须比较字符串的几个字符,从第二个字符到第四个字符(从零开始计数)
该字符串存储在结构元素中,例如zoopla-> real
例如,zoopla - > real有'447889036',其中real是char real类型[20];
  另请注意我不能使用函数strnstr。

代码按预期工作但只是为了好奇,我添加了printf语句,它显示了我的价值直到第四个cahr然后一些garabe字符。
我想知道为什么printf语句显示2个额外的garabe值?

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 个答案:

答案 0 :(得分:3)

在我看来,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;
}

答案 1 :(得分:1)

根据我以前的旧K&amp; R,如果源字符串的字符数少于要复制的字符数,strncpy将只隐式添加空字节。

在这种情况下,zoopla->real有超过5个字符,因此该功能只是复制前五个字符。由于您尚未将内存初始化为零,或者显式添加了空字节,因此字符串不会在第五个字符后终止。因此,当您打印字符串时,您将获得具有基本随机值的其他字节,直到其中一个字符串恰好为零。

答案 2 :(得分:1)

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/ 没有空字符隐式附加到目标的末尾,因此如果源中的C字符串的长度小于num,则目标将仅以空值终止。

你必须添加null自己。

如果要分配常量大小的内存,则只使用数组。

 #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;  
}