首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char c1[ ]="abcde“工作,而char *c1="abcde”变得错误?

char c1[ ]="abcde“工作,而char *c1="abcde”变得错误?
EN

Stack Overflow用户
提问于 2015-01-16 02:42:52
回答 2查看 203关注 0票数 1

我正在做"c编程语言“练习2.4,它删除s1中与字符串s2中的任何字符匹配的每个字符。但是,如果我将Main function中的定义从char c1[ ]="abcde"更改为char *c1="abcde",则会出现分段错误(核心转储)。知道为什么吗?

代码语言:javascript
复制
#include<stdio.h>
#define UNREPEAT 1
#define REPEAT 0

void squeeze(char *s1,char *s2);

void main(){
char c1[]="abcde";
char c2[]="cd";
printf("c1 is %s\n",c1);
squeeze(c1,c2);
printf("the final result is %s\n",c1);
}

void squeeze(char *s1,char *s2){
int i,j,judge;
int k=0;
for(i=0;*(s1+i)!='\0';i++){
  judge=UNREPEAT;   
   for(j=0;*(s2+j)!='\0';j++){
     if (*(s1+i)==*(s2+j)){
      judge=REPEAT;
      break;}
    }

if( judge==UNREPEAT){
  * (s1+k)=*(s1+i);
  k++;}

 }
 *(s1+k)='\0'; 
 }
EN

回答 2

Stack Overflow用户

发布于 2015-01-16 02:44:50

因为

代码语言:javascript
复制
char c1[] = "abcde";

声明一个数组,它是可读和可写的,并且总是有6个字节(如果你考虑终止'\0'),你不能扩展它,但当然你可以用它来存储更少的字节。

代码语言:javascript
复制
char *c1 = "abcde";

是静态字符串文字,则不应对其进行修改,应始终使用const限定符声明字符串文字,这样,如果您试图修改其内容(这是非法的),编译器会发出警告,只需使用

代码语言:javascript
复制
const char *c1 = "abcde";
票数 2
EN

Stack Overflow用户

发布于 2015-01-16 02:45:02

代码语言:javascript
复制
char *c1="abcde"

这是一个字符串文字,它是只读的,在你的函数中,你试图改变它的内容,这样你可能会遇到seg错误。

而另一种情况

代码语言:javascript
复制
char c1[] = "abcde";

您正在堆栈上分配内存,该堆栈的内容可以修改。

PS:字符串文字是只读的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27970677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档