gpt4 book ai didi

c - strtok 段错误

转载 作者:太空狗 更新时间:2023-10-29 16:39:51 27 4
gpt4 key购买 nike

我试图理解为什么以下代码片段会出现段错误:

void tokenize(char* line)
{
char* cmd = strtok(line," ");

while (cmd != NULL)
{
printf ("%s\n",cmd);
cmd = strtok(NULL, " ");
}
}

int main(void)
{
tokenize("this is a test");
}

我知道 strtok() 实际上并没有标记字符串文字,但在这种情况下,line 直接指向字符串 "this is a test" 这是内部是一个 char 数组。是否有任何标记化 line 而不将其复制到数组中?

最佳答案

问题是您正在尝试修改字符串文字。这样做会导致您的程序行为未定义。

说不允许修改字符串文字是过于简单化了。说字符串文字是 const 是不正确的;他们不是。

警告:以下是题外话。

字符串文字 "this is a test"char[15] 类型的表达式(长度为 14,终止 加 1 '\0').在大多数情况下,包括这个,这样的表达式被隐式转换为指向数组第一个元素的指针,类型为 char*

尝试修改字符串文字引用的数组的行为是未定义的——不是因为它是 const(它不是),而是因为 C 标准明确指出它是未定义的。

一些编译器可能允许你逃避这个。您的代码实际上可能会修改与文字对应的静态数组(这可能会在以后造成很大的困惑)。

不过,大多数现代编译器会将数组存储在只读存储器中——不是物理 ROM,而是存储在一个内存区域中,该区域受到保护,不会被虚拟内存系统修改。尝试修改此类内存的结果通常是段错误和程序崩溃。

那么为什么不是字符串文字const?因为您真的不应该尝试修改它们,所以它肯定是有意义的——而且 C++ 确实使字符串文字成为 const。原因是历史的。 const 关键字在 1989 年 ANSI C 标准引入之前并不存在(尽管它可能在此之前由某些编译器实现)。所以 pre-ANSI 程序可能看起来像这样:

#include <stdio.h>

print_string(s)
char *s;
{
printf("%s\n", s);
}

main()
{
print_string("Hello, world");
}

没有办法强制执行 print_string 不允许修改 s 指向的字符串这一事实。在 ANSI C 中制作字符串文字 const 会破坏现有代码,而 ANSI C 委员会极力避免这样做。从那时起就没有机会对语言进行这样的更改。 (C++ 的设计者,主要是 Bjarne Stroustrup,并不关心与 C 的向后兼容性。)

关于c - strtok 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com