开发者社区> 问答> 正文

C语言中*号和[]的区别 c CoderQ 2月13日提问

char s[] = "My name is XXXXXX.";

memmove(s, s + 11, strlen(s) + 1 - 11);

printf("%s\n", s);

这段代码是正常的,但是把s[]换成*s后,执行就报错了,请教其区别

展开
收起
杨冬芳 2016-05-30 19:38:04 2095 0
1 条回答
写回答
取消 提交回答
  • IT从业

    不纯是语言问题, 和编译器也有关

    char s[] = "xxx";是用string literal来初始化一个栈上的数组, 得到的s[]是在栈上 (运行时可写的页), 初始化后的s已经和string literal没关系了.

    char s把s指向那个string literal本身, 很可能是不可写的内存. 比如linux的gcc会把char s指向的字符串放到elf的.rodata区 (运行时被载入到不可写的页). 试图朝不可写的页memmove会segfault.

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        int a = 1;
        char *s1 = "My name is XXXXXX.";
        char s2[] = "My name is XXXXXX.";
        int b = 1;
    
        printf("%p\n", &a);
        printf("%p\n", s1);
        printf("%p\n", s2);
        printf("%p\n", &b);
        return 0;
    }

    另外"修改string literal所在内存"是未定义行为, 知道原理就可以了, 不要这样做

    2019-07-17 19:21:01
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载