我有这两个数组,代码块没有给我任何构建错误,但每当我运行它时,它会给出“Segmention fault”并关闭程序我已调试它并发现我无法更改值从 names1 以这种方式,但改变 names2 这种方式工作正常,有没有办法使这项工作?如果是,我如何让 troca 为 names1 工作?
void troca(char* frase){
unsigned i=0;
while(*(frase+i)!='\0') {
if(*(frase+i)=='O') {
*(frase+i)='0';
}
i++;
}
}
int main(){
char *names1[]={"JOAO","MANUEL","ROBERTO","ZE"};
char names2[][51]={"JOAO","MANUEL","ROBERTO","ZE"};
unsigned i;
for(i=0;i<4;i++) {
troca(names2[i]);
}
return 0;
}
答案 0 :(得分:0)
区别在于:
names1
被简单地声明为没有其他已定义特征的字符串指针数组。在这里使用字符串文字会将字符串文字放入可执行文件中只读的一个部分,因为编译器可以通过这种方式重复使用它们。例如,当您使用char* a = "abc"; char* b = "abc";
时,很可能a
和b
将具有与值相同的内存地址。这意味着您无法修改它们,因此您会收到“分段错误”(同一错误的另一个名称是“访问冲突”)。
names2
被声明为字符数组的数组。分配字符串文字会将字符串的数据复制到数组中,并且由于代码中没有const
内容,因此数组必须是可变的,因此您的字符串存储在char数组中也是可变的。