我有这两个数组,代码块不会给我任何构建错误,但每当我运行它时,它都会给出“段错误”并关闭程序我已经对其进行了调试,发现我无法更改值从 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;
}
最佳答案
区别在于:
names1
简单地声明为字符串指针数组,没有其他定义的特征。此处使用字符串文字会将字符串文字放入可执行文件中的只读部分,因为编译器可以通过这种方式重新使用它们。例如,当您使用char* a = "abc"; char* b = "abc";
时那么很可能a
和b
将具有与值相同的内存地址。这意味着您无法修改它们,因此您会收到“段错误”(同一错误的另一个名称是“访问冲突”)。
names2
被声明为字符数组的数组。分配一个字符串文字会将字符串的数据复制到数组中,并且由于没有 const
在代码中,数组必须是可变的,因此存储在 char 数组中的字符串也是可变的。
关于更改 char 指针数组中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172011/