用指针和数组分别定义的字符串,修改时为什么前者会出错呢?
    //指针定义:
    char *c = "dfdfd,dfd";
    char *s = c;
    *s = 'a';//运行到这里,会报"引发了未经处理的异常:写入访问权限冲突。"

 //数组定义
    char c[20] = "dfdfd,dfd";
    char *s = c;
    *s = 'a';//这里就没有报错

我监视了*s和s的内容,两种方法的内容是一致的,所以不能够理解为什么前者出错,而后者正常.望各位大神前来指教,十分感谢.

0

2个回答

指针指向的字符串是常量空间,只读,不能修改

数组的会分配自己单独的空间,可修改

3
Stephen___Qin
Stephen___Qin 正解
2 年多之前 回复

指针指向的字符串 是分配在**栈**上的, 你是不能修改的,但是可以 逐个访问。
你自己定义的数组空间分配在**堆**上,是可以自己管理的,可访问,可修改。

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

0
Stephen___Qin
Stephen___Qin 你说定义的数组空间分配在堆上在这里是不对的,因为这里不是动态数组,应该是在栈上.
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
编程过程中遇到的错误:指针数组中写入字符串
前言:今天复习结构体数组知识的时候,顺手做了一道编程题,没想到发现了大问题。“指针数组”还是掌握的不好。这篇博客就从那道我发现问题的题目入手,讲解一下学习过程中踩过的坑和自己的课后查漏补缺。 原题目:有3个候选人,每个选民只能投票选一个人,要求编一个统计选票的程序,先后输入备选人的名字,最后输出各人投票结果。(参见谭浩强《c程序设计》第四版p300例9.3) 书上思路:设立一个结构体数组,数组...
字符串数组与字符串指针
最近在学指针,感觉内容繁多,概念不好掌握,除了上自己班的编程课,还去蹭了别人班的课,感觉很有收获,担心自己不及时总结就会忘了,也方便如后复习回顾和学习交流。         首先,先说一个非常基础的概念,字符数组的赋值操作。         给字符数组赋值分两种情况,单字符赋值和字符串赋值。 单字符赋值:可通过数组下标方式或指针方式,引用数组元素,进行赋值 //数组下标法
用指针和数组实现字符串复制
/**************** 用指针和数组实现字符串复制 ****************/ #include #define N 80 void MyStrcpy(char dstStr[],char srcStr[])        //使用字符串数组作为函数参数复制字符串 {     int i = 0;     while(srcStr[i]!= '\0'
用数组存放字符串和用指针存放字符串的区别
1.用数组存取字符串 [cpp] view plain copy  print? #include    void main()   {         char string[] = "Fuck you!";                  printf("%s\n", string);   }   在VS在通过反
C语言,结构体中字符串的声明(采用字符指针还是字符数组)
结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }; 该结构体中name用的是指针而不是数组,所以需要给字符串在堆上申请内存然后再赋值;sex字符串用的是字符数组,因此可以给其赋值; 用字符指针的优势是:字...
为什么输出一个字符数组名会输出一个字符串
printf("%s",q);的语句为何能输出hello这样的字符串呢?这不是指针q的问题,而是printf("%s",q);中控制符%s在发挥作用,它的解释是“从q指向的那个字符开始,一个接一个地把字符打印到屏幕上,直到碰到'\0'为止,且不输出'\0'“。...
在C语言中通过指针改变 const 类型的字符串的方法
在C语言中通过指针改变 const 类型的字符串的方法 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char temp[100]=“abc”; char **p; p=(char **)malloc(sizeof(char **)*100); *p=t...
数组和指针的区别、字符数组和字符串指针区别
1、数组是数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
使用指针实现char型数组,并将输入的字符倒序输出
#include <iostream> #include <stdlib.h> #include <cstring> using namespace std; int main() { char a[10],*p; int m=1,n=3; cout<<"please enter your string:"<<...
定义一个指针数组里面存放了3字符串,也就是数组里放了3个指针
任务和代码:   1 #include   2    3 int main()   4 {   5     char *str[3] = {   6          "helloworld",     7          "I love c"  ,     8          "C Language"      9     };  10     printf("len
C语言通过指针和数组实现字符串倒序
1.数组方式实现  (不用字符串函数)程序如下 1 void ReverseByArray(char * s) 2 { 3 int len = 0; 4 while (s[len] != '\0') 5 len++; 6 int t; 7 for (int i = 0; i 2; i++) 8 { 9
字符串--用数组初始化和用指针初始化方法区别
const char * ptr1 = "fine."; const char ar[] = "fine.";以上的声明中,ptr1和ar都是该字符串的地址,但这两种形式并不完全相同。初始化数组:字符串储存在静态存储区。但是,程序在开始运行时才会为该数组分配内存(以上面的声明为例,数组形式ar[ ]在计算机的内存中分配为一个内含6个元素的数组(每一个元素对应一个字符,还加上一个末尾的空字符‘\0’)
指向字符串的指针 ------ 字符串指针
(1)用字符数组存放一个字符串         char string[]="Linux C";         printf("%s\n",string);         string是一个字符数组名,它同时也是该字符数组的首地址。     (2)用字符串指针来指向字符串         如果不想定义字符数组,就可以只用一个指向字符串的指针,叫“字符串指针”,例如:
C和指针之二维字符串数组用指针数组、数组指针、二级指针打印
1、问题 二位字符串数组用指针数组、数组指针、二级指针打印 2、测试代码 #include int main() { char value[4][5] = {"chen", "yu", "feng", "yy"}; char *p[5]; char (*p1)[5]; char **p2; //把二位数组的值赋给
关于字符数组和字符型指针定义的字符串长度问题
用sizeof和strlen来度量字符串所占字节数和字符串长度的测试Printf(“%ld %ld\n”, sizeof(test), strlen(test));Char *test1 = “nihao”;                //85Char test2[] = “nihao”;                //65Char test3[20] = “nihao”;        ...
数组指针为什么不能使用strcpy
编程中遇到的问题,终于弄明白了: 例程说明如下: #include <stdio.h> #include <string.h> int main(char argv,char *argc[]) { char *b[10]; //定义一个指针数组 char str="hello world"; strcpy(b[0],str); p...
数组指针,字符串指针的几种定义方法
一:数组指针的定义方法int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p; p = &a[0]; // 等价于p = a;2.int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p = a; //定义指针时直接赋值; 二:输入字符串的方法1.直接把字符串输入到字符数组char str[] = "I love China!"; p
字符串在指针和数组上赋值的区别
1  #include<stdio.h> 2  int main() 3  { 4     char *str1 = "abcde";// 字符串常量 5     char str2[] = "abcde";// 字符数组 6    str1[0] = 'x';//error 7    str2[0] = 'x'; 8    return 0; 9    } 注:代码运行到第6行崩...
使用字符串指针变量和字符数组的区别
用字符数组和字符指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘/0’作为串的结束。字符数组是由若干个数组元素组成的,它可用来存放整个字符串。 2. 对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char
指针、数组、字符串(一)指针的概念
什么是指针?     我们知道,可执行程序是由指令、数据和地址组成的。当CPU访问内存单元时,不论是读取还是写入,首先必须把内存单元的地址加载到地址总线(AB)上,同时将内存电路的“读写控制”设为有效,然后内存单元中的数据就通过数据总线(DB)“流”向了接收寄存器中,或者结果寄存器中的值“流”向了目标内存单元中。这就是一个“内存读写周期”。内存单元的地址就是指针的值。 指针是变量吗?
字符串常量存储在字符指针和字符数组的区别
C语言中字符串常量的存储方式有两种:字符指针和字符数组中。 就我目前所能理解到的程度,这两种方式的区别如下: 字符指针: char *m = “February”; 可以写成: char *m; m = “February”; 字符数组: char s[] = {“language”}; 不能分开写。 如果要分开写的话,就只能是给数组的每个元素逐一赋值。 但就这一点来看的话...
二级指针操作二维字符串数组
#include <stdio.h> #include <stdlib.h> int main(){ char *a[20]={"saa","sdadsa"}; //or char a[20][10]={"saa","sdadsa"}; char **p=
字符数组和字符串指针在内存中存储
#include #include char* strcpy1(){ char *p = "hello kitty"; printf("%s\n", p); return p; } int main(){ printf("%s", strcpy1()); return 0; } 字符串在内存中存储在只读数据段,当定义一个字符串指针时,该指针指向这个只读区域,即使在函数中将这个指针返回
最全的C语言指针详解
指针定义与使用、指针与函数、指针与数组、指针与字符串、指针数组与多级指针 、指针与动态内存分配
字符串数组与字符串指针数组
1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy() 2,附以下代码: 主要完成将”I am from china ”倒置为”china from am I”, 最开始编写时,将str定义为字符串数组,怎么都出不来结果。半天才发现应该用字符串指针数组 3,那么问题来了,字符串数组和字符串指针数组有什么区别 ...
C语言的字符指针变量和字符串数组的区别
前言 本博文的代码基于VC++6.0开发调试; 本博文概念比较多,属于学习笔记类型; 具体的区别 从概念上来说:
用指针数组的方法将字符串排序
用指针数组的方法将字符串排序
C++中字符串数组名和字符串指针的区别
        字符串数组名是一个常量指针  指针不能更改  指针内容可以更改(下图中企图用字符串数组名b给a赋值,报错,因为此时的数组名是一个常量指针) 字符串指针是一个指针常量  所指内容不能变  但是指针可以引用另一个指针(预图更改字符串指针所指向内容时候程序崩溃)  ...
C++ 在头文件中声明定义字符数组或指针变量
C++ 在头文件中声明定义字符数组或指针变量
指针与malloc函数
指针与malloc函数 一般定义完指针后系统不会为它将指向的变量分配内存空间, 故我们要用到malloc函数为它分配动态内存。 比如我们用指针定义一个数组,如果用malloc函数就用,是存在问题的。 现在我们通过对比一下指针定义数组与原始定义数组来看看指针与malloc函数的密切关系 #include<stdio.h> #include<stdlib.h> int main...
一个int型指针指向一个字符数组
不同类型指针取值的实际情况
C专家编程 十四 为什么NULL指针会导致printf函数崩溃?
有一个经常被问到的问题是:“为什么向printf()函数传递一个NULL指针会导致程序的崩溃?”人们似乎觉得可以像下面这样编写代码: char *p = NULL; /*…*/ printf("%sH, p);        并认为它不会崩溃。顾客们有时会抱怨:“它在我的HP/IBM/PC上不会崩溃。”他们希望当 printf()传入一个NULL指针时,它会打印出空字符串。
输入一行字符串,要求统计其中字母,空格,数字以及其他字符的数目,要求用数组,要求用数组和指针两种形式。
代码如下(循环使用getchar读取字符) #include <stdio.h> int main() { int a,b,c,d; char ch=0; a=b=c=d=0;//计数器初始化为0. printf("请输入字符串:\n") ; while((ch=getchar())!='\n')//循环读取字符,到换行结束。 {
指针和数组的区别 (从下标运算符[ ]看)
数组和指针的区别令人困惑,很多人常常把数组名和指针看作是相同的——毕竟它们都是个地址。而且好像都可以进行算数操作、利用下标运算符运算。 例如如下代码,当把a的地址拷贝给p后,可以像把p当作a的引用一样使用:#include <stdio.h> int main(){ int *p; int a[5] = {0, 1, 2, 3, 4}; p = a; for(int
C语言---关于char型数组和char型指针的问题
今天在学习数据结构中线性表的过程中,碰到了关于char型数组和指针的问题。说实话这也是困扰了我许久的问题。 问题具体描述 如上代码,定义了一个char型数组a后,将其作为形参传入insert()函数,再返回数组a的地址。 编译出错。错误代码如下: 不兼容的参数类型赋值:char*赋值char[8]。 1.由于返回值不可能为一个数组,所以只能通过修改主函数中a的类型:cha
指针数组&数组指针的分配内存及函数参数 C语言版
最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了。所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了《C缺陷和陷阱》也没有我想要的东西。要么就是C和C++混为一谈,new int[5]这种语法C肯定是错误的,所以找个机会总结一下,然后希望以后不要再栽在基础上。定义指针数组:int p[10] 数组指针 int(*p)[5]
指针变量为什么可以作为“数组名”?
在严蔚敏《数据结构(C语言版)》中,发现, p22定义顺序存储结构: typedef srtuct{ ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量 }SqList; 这里,elem为ElemType类型的指针变量,随后在p22的插入函数中,定义了L为SqList类型的结构体变量
变量未初始化时输出乱码的原因
初学C语言时老师警告的一个问题:变量定义时一定要赋值,否则直接使用时就会出现意想不到的后果。今天我们就来看看未初始化的变量里边是什么东西。        先看测试程序: #include int main(void) { int i; double d; printf("%d\n%lf\n", i, d); printf("%0X\n", i); printf("%0X\n
C++中字符数组char c[],“指向字符型的指针”char* p,“指向字符型的指针数组”char* p[]
从定义来看就像标题一样 为什么打引号,其实实际使用中c++编译器把char* 当成c语言字符串, char ch[]=&quot;word&quot;; char* p=ch; p解析后得到是字符串首字符‘w’,p指向数组地址,而数组名是数组首元素的地址 std::cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; std::endl;//输出w std::cout &amp;lt;&amp;lt; p &amp;lt;&amp;lt; s...
字符串指针数组详解
#include &amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; int main(void) { char *str[] = {&amp;amp;amp;quot;abg&amp;amp;amp;quot;,&amp;amp;amp;quot;cd&amp;amp;amp;quot;};//*单独拿出来,指的是数组里的内容是*型的,str的类型是char *[]型 printf(&amp;amp;amp;quot;%c\n&a