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

How is C managing memory in this situation?

提问人:DJames 提问时间:9/14/2023 最后编辑:Vlad from MoscowDJames 更新时间:9/15/2023 访问量:75

问:

考虑 in C 中的这个实现strtok()

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

为什么不必显式分配内存?喜欢或 ?我本来以为上述实现会出段错误。我需要担心解除分配吗?ptpt[128]pt = malloc(...)

指针内存 C-strings strtok

评论

2赞 rubikonx9 9/14/2023
这个例子中有什么?这就是需要管理的。line
1赞 Lundin 9/14/2023
这在 (C17 7.24.5.8 或 ) 的文档中非常清楚。我认为你应该问一下该文档中你不明白它们是什么意思的部分。strtokman strtok
2赞 Lundin 9/14/2023
无论如何,tl;dr 是 strtok 重新组织传递的字符串,以便将分隔符替换为 null 终止符。重复调用将循环访问此修改后的字符串,并返回指向每个子字符串的第一个字符的指针,直到没有剩余的字符。仅此而已......
1赞 Fe2O3 9/14/2023
OT:另一个库函数 ,返回指向已分配内存的指针。调用方负责释放该指针。但是,不分配任何必须为 'd 的内存。strdup()strtok()free()

答:

4赞 0___________ 9/14/2023 #1

line必须引用可修改的数组,并且大多数实现都使用此内存。charstrtok

这就是为什么您不必为此操作提供任何额外内存的原因。

请记住,在此操作期间将被修改(销毁)。line

pt将保存(如果不是)对所引用的数组元素之一的引用NULLline

评论

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, ":");

该函数仅返回指向分配给指针的选定子字符串的指针。strtokpt

以此类推,您可以考虑另一个函数,该函数搜索字符串中是否存在指定字符,并返回第一个找到此类字符的地址或 NULL。strchr

pt = strchr( line, ':' );