菜单开关

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

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

评论列表