• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > C语言字符串用数组和指针初始化为什么会有这样的区别?

C语言字符串用数组和指针初始化为什么会有这样的区别?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了字符串指针数组,指向字符串数组的指针,c语言字符串指针数组,指针数组存放字符串,字符串数组初始化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:C 语言字符串用数组和指针初始化为什么会有这样的区别?
描述:

直接用数组初始化:

#include <stdio.h>

int main(void) {
  char str[] = "abc";
  int i = 0;
  while (str[i] != '\0') {
    printf("%c\n", str[i]);
    i++;
  }

  str[1] = 'd';

  return 0;
}

没有问题,正常输出,没有报错。

但是如果用指针初始化:

#include <stdio.h>

int main(void) {
  char *str = "abc";
  int i = 0;
  while (str[i] != '\0') {
    printf("%c\n", str[i]);
    i++;
  }

  str[1] = 'd';

  return 0;
}

它执行到 str[1] = 'd' 的时候,就会报 segmentation fault,我在网上搜了一下,
都是说通过指针初始化的字符串是个常量,不能改变。感觉这个很坑啊,只是 char str[] = "abc" 和 char *str = "abc"; 这样小的区别而已,为什么通过指针初始化的那个就要是常量呢?是 C 语言规定就是这样,还是是可以理解的?


解决方案1:

数组的字符串内存属于栈, 所以是可读可写;
指针的字符串内存属于代码块, 只可读, 这个地址程序运行后一直存在且不变.

解决方案2:

指针初始化时定义了一个指针指向常量地址,而数组初始化时是该数组申请了地址空间用于存储常量字符串的内容。因此,前者不可变,而后者是可变的。

解决方案3:

编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。

对于char *c="abc";程序启动时直接加载到了.data段。当你再定义一个char *d="abc"时,这两个指针公用一块内存。因此你不能随便改这里的内容,它是共享的,只读的。
你就理解成编译器共享常量字符串为了省内存吧。
但是对于char a[]="abc";这种定义是在程序执行时,动态在stack段申请的,因此a,b两个指针的地址不一样。就只有你一个人用,而且函数返回后就销毁了。栈上的内存都是可以随便更改的。

验证:

#include<stdio.h>
int main(){
    char a[]="abc";
    char b[]="abc";
    
    char *c="abc";
    char *d="abc";
    
    printf("%p\n", a);
    printf("%p\n", b);
    printf("%p\n", c);
    printf("%p\n", d);
}

结果:

@ ?  ~  ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言字符串用数组和指针初始化为什么会有这样的区别?

相关文章

  • 2017-06-07 七牛怎么存储流媒体文件比如:mms://?
  • 2017-06-07 如何写PHP代码让客户浏览器缓存页面?
  • 2017-06-07 pythonsqlalchemy实现top语句
  • 2017-06-07 jboss50GA发布EAR异常
  • 2017-06-07 (laravel)数据表一对一关联问题
  • 2017-06-07 (python)求进PySpider启动时OSError:[Errno28]Nospaceleftondevice
  • 2017-06-07 JBOSS运行报错
  • 2017-06-07 NotEjb3ConfigurationtoJNDI,noJNDInameconfigured什么错误
  • 2017-06-07 求助!Nvidia显卡如何安装配置OPENCL?
  • 2017-06-07 excel文件关闭

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 苹果Macbook和Win7系统,我想通过wifi搭建局域网?
    • 找人搞个七牛上传,本人是小白什么都不会。
    • 关于MfC中的宏有的后面带一\的作用是什么?
    • 不同用户环境使用gem的一个问题
    • 用Python27&PyQt487写了一个小工具,但是程序关闭的时候程序会崩溃,不知道怎么调试
    • 急求答案:jbossjdbcnotbound
    • 服务器拨VPN后搭建Socks5,客户机通过Socks5连接服务器
    • (python)sae文档说已经内置了MySQLdb模块,为什么我调用其时它却不存在?
    • 为什么在jboss中可以,在tomcat中不可以?
    • 用批处理的start命令来运行指定Python脚本的时候,只要这个Python脚本的路径或名字带有中文就无法执行,请问怎么解决?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有