【问题标题】:garbage value when using malloc使用 malloc 时的垃圾值
【发布时间】:2011-07-19 20:17:53
【问题描述】:

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

代码按预期工作,但只是出于好奇,我添加了 printf 语句,它显示我的价值直到第 4 个 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);               

欢迎大家提出批评和建议

【问题讨论】:

  • 你能告诉我们zoopla->real的价值是什么吗?
  • 你为什么要mallocing copyTemp 而不仅仅是char copyTemp[6] = {0,0,0,0,0,0};?这也需要对其进行零初始化。
  • @Kerrek SB copyTemp[6] = {0} 就足够了吧?或者他可以使用 calloc
  • @Vivek: Err.. 我不确定缺少的数组成员是否会归零,所以我想明确一点。 calloc 是可能的,但我的意思是为什么将六个字节放在堆上并引起头痛......
  • 我知道我可以在没有 malloc 的情况下使用 char,但只是对使用 malloc 感到好奇。有什么害处吗?

标签: c malloc


【解决方案1】:

在我看来,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】:

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

    【讨论】:

      【解决方案3】:

      根据我的旧 K&R,strncpy 只会在源字符串的字符数少于要复制的字符数时隐式添加空字节。

      在这种情况下,zoopla-&gt;real 有超过 5 个字符,所以函数只是简单地复制前五个字符。由于您尚未将内存初始化为零,或显式添加空字节,因此字符串不会在第五个字符之后终止。因此,当您打印字符串时,您会获得具有基本随机值的额外字节,直到命中一个恰好为零的字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2022-06-14
        相关资源
        最近更新 更多