当前位置: 技术问答>linux和unix
关于Linux下运行C出现“段错误”,请帮帮忙啊!
来源: 互联网 发布时间:2016-06-10
本文导语: #include copyString(char *p1,char *p2) { while(*p1!='') { *p2=*p1; p1++; p2++; } *p2=''; } int main() { char *a="I am...
#include
copyString(char *p1,char *p2) {
while(*p1!='') {
*p2=*p1;
p1++;
p2++;
}
*p2='';
}
int main() {
char *a="I am a teacher.";
char *b="You are a student.";
printf("初始化后的字符串:n%sn%sn",a,b);
copyString(a,b);
printf("复制后的字符串:n%sn%sn",a,b);
}
编译能通过,gcc -o myc myc.c
可是运行时, ./myc 死活得不到结果,提示:"段错误!"
copyString函数中的char *p1的起始地址相当于是char *a中的起始地址啊。程序怎么就有问题了呢?
谢谢各位了!
copyString(char *p1,char *p2) {
while(*p1!='') {
*p2=*p1;
p1++;
p2++;
}
*p2='';
}
int main() {
char *a="I am a teacher.";
char *b="You are a student.";
printf("初始化后的字符串:n%sn%sn",a,b);
copyString(a,b);
printf("复制后的字符串:n%sn%sn",a,b);
}
编译能通过,gcc -o myc myc.c
可是运行时, ./myc 死活得不到结果,提示:"段错误!"
copyString函数中的char *p1的起始地址相当于是char *a中的起始地址啊。程序怎么就有问题了呢?
谢谢各位了!
|
CPU有内存管理单元(MMU),Linux会利用这个特征,使得常量所在的地址空间不可写。当这样: char *a="I am a teacher."; 时,a 指向常量地址空间; 而当这样: char b[]="I am a teacher."; 时,根据上下文,b指向静态空间(若不在函数内部)或者栈空间(函数内部)。
|
或者给指针用malloc分配好空间
你定义的是字符串常量,当然不能赋值操作了
一般报段错误 都是指针和内存访问方面的问题
你定义的是字符串常量,当然不能赋值操作了
一般报段错误 都是指针和内存访问方面的问题
|
#include
copyString(char *p1,char *p2) {
while(*p1!='') {
*p2=*p1;
p1++;
p2++;
}
*p2='';
}
int main() {
char *a="I am a teacher."; //这是常量区数据,改为char a[]="I am a teacher."; 下同
char *b="You are a student.";
printf("初始化后的字符串:n%sn%sn",a,b);
copyString(a,b); //此外你的a明显空间比b少,copy的时候会导致内存越界。建议声明为char a[100];
printf("复制后的字符串:n%sn%sn",a,b);
}
|
把
char *a="I am a teacher.";
char *b="You are a student.";
換成
char a[]="I am a teacher.";
char b[]="You are a student.";
試試。
char *a="I am a teacher.";
char *b="You are a student.";
換成
char a[]="I am a teacher.";
char b[]="You are a student.";
試試。
|
不要这样初始化,改成这样
char a[]="I am a teacher.";
char b[]="You are a student.";
char a[]="I am a teacher.";
char b[]="You are a student.";
|
老兄,你那两个字符串是常量的呢,常量是只读的,改成b[]吧。
|
楼上都没看清代码啊,copyString显然是将a拷贝到b, 所以a是什么,是大是小并不重要,而b是要对它进行写操作的,所以必须是变量形式,只要把它改成b[]程序就OK了