提问人:DJames 提问时间:9/14/2023 最后编辑:Vlad from MoscowDJames 更新时间:9/15/2023 访问量:75
在这种情况下,C 如何管理内存?
How is C managing memory in this situation?
问:
考虑 in C 中的这个实现strtok()
char *pt;
pt = strtok(line, ":");
if (pt != NULL)
{
pt = strtok(NULL, ":");
}
为什么不必显式分配内存?喜欢或 ?我本来以为上述实现会出段错误。我需要担心解除分配吗?pt
pt[128]
pt = malloc(...)
答:
4赞
0___________
9/14/2023
#1
line
必须引用可修改的数组,并且大多数实现都使用此内存。char
strtok
这就是为什么您不必为此操作提供任何额外内存的原因。
请记住,在此操作期间将被修改(销毁)。line
pt
将保存(如果不是)对所引用的数组元素之一的引用NULL
line
评论
1赞
Ian Abbott
9/14/2023
还值得一提的是,当返回非 null 指针时,它会指向字符串中最初作为非 null 第一个参数传递的位置。第一个参数为 null 的后续调用将返回指向同一字符串中位置的指针。strtok
0赞
Eric Postpischil
9/14/2023
不是“最有可能”。绝对。 指定返回指向字符串中字符的指针,而不是该字符串的副本。strtok
0赞
Vlad from Moscow
9/14/2023
#2
如果您有一个字符数组,例如:
char s[] = "Hello World";
然后,您可以使用可以指向数组的任何字符的指针。例如,这一行:
char *p = s;
这相当于:
char *p = &s[0];
指向数组中存储的字符串的第一个字符。"Hello World"
s
这一行:
p = s + 6;
将指针设置为指向存储在数组中的此字符串的子字符串。p
"World"
s
该函数将传递的字符串拆分为子字符串,用零个字符“\0”替换分隔符,并仅返回指向所选单词的指针。strtok
例如,在以下语句中:
pt = strtok(NULL, ":");
该函数仅返回指向分配给指针的选定子字符串的指针。strtok
pt
以此类推,您可以考虑另一个函数,该函数搜索字符串中是否存在指定字符,并返回第一个找到此类字符的地址或 NULL。strchr
pt = strchr( line, ':' );
评论
line
strtok
man strtok
strdup()
strtok()
free()