菜单开关

周梦康 发表于 2017-09-17 904 次浏览 标签 : C语言快速入门

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

strtok 演示

期望的结果是s字符串被截断为12345

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char *s = "123456789";
    char *tmp = NULL;

    tmp = strtok(s, "6");

    printf("%s\n", s);
    return 0;
}

实际运行的结果为

Bus error: 10

修改下

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // char *s = "123456789";
    char s[10] = "123456789";

    char *tmp = NULL;

    tmp = strtok(s, "6");

    printf("%s\n", s);
    return 0;
}

结果正常了

zhoumengkang@bogon:~/Downloads$ gcc test2.c -o test2
zhoumengkang@bogon:~/Downloads$ ./test2
12345

char *s是存在只读区(常量区),不能被改写;
char s[10]是存在栈上,是可以随意改写的。

扩展演示

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char *a = "123456789";
    char b[10] = "123456789";


    printf("a\t%p\n", a);//只读区
    printf("a的指针的地址\t%p\n", &a);//栈
    printf("b\t%p\n", b);//栈
    printf("main\t%p\n", main);//代码区
    return 0;
}

运行结果

a    0x100a4cf74
a的指针的地址    0x7fff5f1b3ac0
b    0x7fff5f1b3ade
main    0x100a4ce80

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表