gpt4 book ai didi

C: 将 strtok token 分配给 char * 段错误

转载 作者:太空狗 更新时间:2023-10-29 15:53:59 28 4
gpt4 key购买 nike

为什么使用以下代码会出现段错误?

#include <stdio.h>

int main()
{
char * tmp = "0.1";
char * first = strtok(tmp, ".");
return 0;
}

编辑:

#include <stdio.h>

int main()
{
char tmp[] = "0.1";
char *first = strtok(tmp, ".");
char *second = strtok(tmp, "."); // Yes, should be NULL
printf("%s\n", first);
printf("Hello World\n");
return 0;
}

段错误可以在此处的在线 gdb 上重现: https://www.onlinegdb.com/online_c_compiler

最佳答案

您的第一个代码的问题是 tmp指向一个字符串文字,它是只读的。当strtok试图修改字符串,它崩溃了。


你的第二个代码的问题是缺少包括:

#include <string.h>

缺少的 header 表示 strtok在您的程序中未声明。 C 编译器假定所有未声明的函数返回 int .这对于 strtok 是不正确的,返回 char * .您的示例中崩溃的可能原因是代码在 64 位机器上运行,其中指针为 8 字节宽但 int只有4个字节。这弄乱了 strtok 的返回值, 所以 first是一个垃圾指针(printf 在尝试使用它时崩溃)。

你可以自己确认

char *first = strtok(tmp, ".");
printf("%p %p\n", (void *)tmp, (void *)first);

tmp 打印的地址和 first应该是相同的(如果你是 #include <string.h>,它们就是相同的)。


有趣的是 gcc 可以就这些问题警告您:

main.c: In function 'main':
main.c:6:19: warning: implicit declaration of function 'strtok' [-Wimplicit-function-declaration]
char *first = strtok(tmp, ".");
^
main.c:6:19: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
main.c:7:20: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
char *second = strtok(tmp, "."); // Yes, should be NULL
^

...并且 onlinegdb 会向您显示这些警告,但前提是编译失败!

因此,要在 onlinegdb 上看到编译器警告,您必须向代码添加硬错误(例如,通过在文件的最后一行放置 @)。

关于C: 将 strtok token 分配给 char * 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52131751/

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