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

问题描述 投票:0回答:2

考虑

strtok()
在 C 中的实现

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

为什么

pt
不必显式分配内存?喜欢
pt[128]
还是
pt = malloc(...)
?我本以为上面的实现会出现段错误。我需要担心释放问题吗?

c memory strtok
2个回答
3
投票

line
必须引用可修改的
char
数组,并且大多数
strtok
实现正在使用此内存。

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

请记住,在此操作期间

line
将被修改(销毁)。


1
投票

如果您有一个字符数组,例如

char s[] = "Hello World";

那么你可以使用一个可以指向数组中任意字符的指针。例如这一行

char *p = s;   

相当于

char *p = &s[0];   

指向存储在数组

"Hello World"
中的字符串
s
的第一个字符。

这条线

p = s + 6;

设置指针

p
指向存储在数组
"World"
中的第trng的子字符串
s

函数

strtok
将传递的字符串拆分为子字符串,用零个字符“ ”替换分隔符,并仅返回指向所选单词的指针。

例如在这个声明中

pt = strtok(NULL, ":");

这个函数

strtok
只是返回一个指向选定子字符串的指针,该子字符串被分配给指针
pt

以此类推,您可以考虑另一个函数

strchr
,它搜索指定字符是否存在于字符串中,并返回第一个找到的此类字符的地址或 NULL。

pt = strchr( line ':' );
© www.soinside.com 2019 - 2024. All rights reserved.