关于何时使用malloc
或在这种情况下strdup
,我几乎没有问题
以下是我从网上偷来的小功能
我试图理解代码,但几乎没有问题
1.代码已将值分配给psrc
和pdest
。例子
char* psrc = dups;
char* pdest = s;
怀疑:我们不需要使用malloc
为psrc和pdest分配空间。如果不是那么为什么。
pdest [0] = '\0';
上面的行在pdest
字符串的开头分配终止字符。那么为什么我们已将pdest
分配给s
。例如char* pdest = s;
? 任何帮助或批评对我都有帮助。 感谢致敬, 萨姆
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;
}
答案 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内存中)。
答案 4 :(得分:0)
1)你在 psrc 和 pdest 中得到的只不过是另一个指向字符串的指针。这并不意味着你有2个字符串,而是指向同一个字符串的两个指针。字符串不重复。您不需要分配 psrc 和 pdest ,因为编译器在声明它们时已经为这些变量分配内存(就像您不需要为内存分配内存一样) int a ,例如)。它们只是32位无符号整数(对于32位系统,就是这样)。
2)pdest用于不修改原始s值,因为pdest在while循环内被修改。同样,字符串不重复,所以实际上pdest正在修改s指向的字符串。
答案 5 :(得分:0)
psrc
指向与dups
相同的内存位置。如果要复制该内存位置的内容,则需要分配内存然后复制。 (malloc + memcpy)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;
}