菜单开关

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

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

strcpy 演示

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

int main(int argc, char const *argv[])
{
    char *s = "11111";
    char *d;

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

编译运行

Segmentation fault: 11

为什么呢?

因为d在初始化的时候没有申请内存;默认只是分配了字符串首地址(指针),通过下面的程序可以看到

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

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

    printf("%p\n", &d);

    printf("sizeof(d) is: %lu\n",sizeof(d));

    strcpy(d,s);
    printf("%s\n", d);
    return 0;
}
0x7fff5a2c7ad0
sizeof(d) is: 8
Segmentation fault: 11

要想程序运行没有意外,那么就应该提前给字符串申请一块内存,足够存放这些字符。
上面的例子中是1~9的数字,再加上末尾的\0所以,需要10个字节,那么我们需要申请至少10个字节的空间。

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

int main(int argc, char const *argv[])
{
    char *s = "123456789";
    char *d;
    
    printf("%p\n", &d);
    
    char buff[10] = {0};
    d = buff;
    
    printf("%p\n", &d);
    printf("%p\n", &buff);
    printf("%p\n", d);
    
    strcpy(d,s);
    printf("%s\n", d);
    return 0;
}
0x7fff5fbff768
0x7fff5fbff768 // 赋值之后,d的指针地址不变
0x7fff5fbff78e
0x7fff5fbff78e // d 里面存放的值就是 buff 的指针地址
123456789

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

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

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

评论列表