在这种情况下,C是如何管理内存的?

hjzp0vay  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(95)

考虑strtok()在C中的实现

char *pt;
pt = strtok(line, ":");
if (pt != NULL)
{
    pt = strtok(NULL, ":");
}

为什么pt不需要显式分配内存?比如pt[128]还是pt = malloc(...)?我本以为上面的实现会出现segfault。我是否需要担心取消分配?

8ehkhllq

8ehkhllq1#

line必须引用可修改的char数组,大多数strtok实现都使用此内存。
这就是为什么您不必为该操作提供任何额外内存的原因。
请记住,line将在此操作期间被修改(销毁)。
pt将保存(如果不是NULL)对line引用的数组中的一个元素的引用

lmyy7pcs

lmyy7pcs2#

如果你有一个字符数组,例如:

char s[] = "Hello World";

然后你可以使用一个指针,它可以指向数组中的任何字符。例如这一行:

char *p = s;

这相当于:

char *p = &s[0];

指向存储在数组s中的字符串"Hello World"的第一个字符。
这一行:

p = s + 6;

设置指针p指向存储在数组s中的该字符串的子串"World"
函数strtok将传递的字符串拆分为子字符串,用零字符'\0'替换分隔符,并返回指向所选单词的指针。
例如,在这个声明中:

pt = strtok(NULL, ":");

函数strtok仅返回指向分配给指针pt的所选子串的指针。
通过类比,你可以考虑另一个函数strchr,它搜索一个指定的字符是否存在于一个字符串中,并返回第一个找到的这样一个字符的地址或NULL。

pt = strchr( line, ':' );

相关问题