c++ - C-Segmentation fault (core dumped)

 书友72177273 发布于 2022-11-05 00:15

下面程序是用C语言写的逆置字符串,我觉得逆置函数没问题,但是传参数的不同会导致运行时的Segmentation fault (core dumped),什么原因呢?

#include 

void reverse(char *str){
   char *end=str;
   char tmp;
   if(str){
     while(*end){
        ++end;
     }
     --end;
     while(str

update:感谢@spacewander的解答,后来亲自测试了下:

#include 

void modify(char *str){
    str[2]='a';
}
int main(){
    char s[]="test";
    char *c="test";
    modify(s);
    printf("%s\n",s);//正常
    modify(c);      //core dumped
    printf("%s\n",c);
    return 0;
}
3 个回答
  • char *str2="abcd";
    str2不能被修改

    2022-11-09 00:16 回答
  • char str1[]="abcd";
    char *str2="abcd";

    str1和str2的意义是不同的。跑代码的时候,内存通常被分为堆区,栈区,代码区,全局和静态变量区,常量区等。str1是普通的字符数组,是一个变量,如果它是全局的,就放在全局和静态区;如果是它是局部的,就放在栈里。str2是个字符串指针,它指向一段字符串常量“abcd”,这段字符串常量放在常量区,不能修改。

    你可以把str1看成一个指针,那是因为数组名就是数组的首地址,地址就是指针,仅此而已。如果你再声明一个char *str3 = "abcd";你会发现str2和str3是相等的,因为它们都指向同一个字符串常量,那个常量的位置固定,str2和str3自然相等。但是如果你再声明一个char str4[] = "abcd"; 你会发现str1和str4不相等,原因就是这两个字符数组存储在不同的位置,str1和str4作为首地址,当然也不同。

    2022-11-09 00:25 回答
  • 正好StackOverflow上有一个问题是关于"char s[] 和 char *s"的区别:
    http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c

    char *s所赋值的变量,会被编译器放在内存中栈的只读数据段。对于直接用s所做的修改,会因为错误的内存访问而发生段错误。

    证明:
    你在char *str2="abcd";下添加一行str2[0] = 'b';,那一行就会发生段错误了。

    2022-11-09 00:27 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有