什么时候去malloc,什么时候不去-c编程

时间:2011-09-29 10:47:13

标签: c malloc

关于何时使用malloc或在这种情况下strdup,我几乎没有问题 以下是我从网上偷来的小功能 我试图理解代码,但几乎没有问题  1.代码已将值分配给psrcpdest。例子

char* psrc = dups;  
char* pdest = s;  

怀疑:我们不需要使用malloc为psrc和pdest分配空间。如果不是那么为什么。

  1. pdest [0] = '\0'; 上面的行在pdest字符串的开头分配终止字符。那么为什么我们已将pdest分配给s。例如char* pdest = s;
  2. 任何帮助或批评对我都有帮助。 感谢致敬, 萨姆

     char* deldupchars (char* s)    
     {      
       char* dups = strdup (s);      
       if (dups)     
       {      
        char* psrc = dups;      
        char* pdest = s;      
        char ch;      
    
        pdest [0] = '\0';      
        while ((ch = *psrc++) != '\0')    
        {            
         if (! strchr (pdest, ch))    
         {           
           *pdest++ = ch;           
         }             
        }       
        pdest [0] = '\0';      
        free (dups);       
       }      
       return s;       
     }       
    

7 个答案:

答案 0 :(得分:1)

char* psrc = dups;      

由于dups已分配strdup,因此无需在此分配。

char* pdest = s;

由于呼叫者已分配s,因此无需在此分配。

pdest[0] = '\0';

这会写入字符串的内容。赋值pdest = s指定指针但不指定内容。

答案 1 :(得分:0)

我们不必为重复分配内存,因为char * psrc = dups语句不会复制重复点的位置,只是它指向的位置。这意味着在strdup中完成的分配对于两个指针都足够了

答案 2 :(得分:0)

strdup() malloc() s字符串的内存,这就是你可以通过strdup()返回的指针存储的原因。但你必须free()那个你正确做的记忆。

来自strdup()手册页:

  

strdup()函数返回指向新字符串的指针   是字符串s的副本。新字符串的内存是   使用malloc(3)获得,可以使用free(3)释放。

答案 3 :(得分:0)

strdup将在其中执行malloc并返回已分配的内存(这就是为什么你需要在函数的末尾调用free(dups))。

pdest / psrc只是一个指针(即:仅引用先前从's'分配的内存,后来用于遍历分配的内存)。我认为主要的困惑是指针就是这样:它们指向内存中的一个地址 - 所以,你可以有许多指向同一个内存地址的指针,你可以使用该指针来处理 - 在之前的malloc内存中)。

请参阅:http://www.mkssoftware.com/docs/man3/strdup.3.asp

答案 4 :(得分:0)

1)你在 psrc pdest 中得到的只不过是另一个指向字符串的指针。这并不意味着你有2个字符串,而是指向同一个字符串的两个指针。字符串不重复。您不需要分配 psrc pdest ,因为编译器在声明它们时已经为这些变量分配内存(就像您不需要为内存分配内存一样) int a ,例如)。它们只是32位无符号整数(对于32位系统,就是这样)。

2)pdest用于不修改原始s值,因为pdest在while循环内被修改。同样,字符串不重复,所以实际上pdest正在修改s指向的字符串。

答案 5 :(得分:0)

  1. 您没有值分配,但指针分配。这意味着psrc指向与dups相同的内存位置。如果要复制该内存位置的内容,则需要分配内存然后复制。 (malloc + memcpy)
  2. pdest [0] = '\0'; - 此处没有分配。这只是将null-terminator放在它指向的数组的开头。 char* pdest = s;使{p}指向与s相同的记忆。

答案 6 :(得分:0)

#include <stdio.h>

size_t undup (char *str);
size_t undup (char *str)
{
size_t src, dst;

for (src=dst=0; str[dst] = str[src++] ; ) {
  if (str[dst] != str[src] ) dst++;
  } 
return dst;
}

int main (int argc, char **argv)
{

  printf ("Before:%s\n", argv[1] );
  (void) undup ( argv[1] );
  printf ("After:%s\n", argv[1] );

  return 0;
}