【问题标题】:changing strings in array of char pointers [closed]更改 char 指针数组中的字符串 [关闭]
【发布时间】:2016-05-11 19:48:04
【问题描述】:

我有这两个数组,代码块没有给我任何构建错误,但是每当我运行它时,它都会给出“分段错误”并关闭程序我已经调试过它并发现我无法更改值以这种方式从 names1 更改 names2 效果很好,有没有办法让它工作?如果是,我如何让 trocanames1 工作?

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;
}

【问题讨论】:

  • google 字符串文字
  • 这里不相关,但我在某处读到指向相同字符串文字的两个变量可能共享相同的内存。改变一个也可能改变另一个..
  • 请将实际代码发布为Minimal, Complete, and Verifiable example。显然这不是你的代码——如果它不能编译它就不能产生段错误。

标签: c arrays string pointers char


【解决方案1】:

区别在于:

names1 被简单地声明为字符串指针数组,没有其他定义的特征。在此处使用字符串文字会将字符串文字放入可执行文件中的只读部分,因为编译器可以通过这种方式重用它们。例如,当您使用char* a = "abc"; char* b = "abc"; 时,ab 很可能具有相同的内存地址作为值。这意味着您无法修改它们,因此您会收到“分段错误”(同一错误的另一个名称是“访问冲突”)。

names2 被声明为字符数组的数组。在那里分配一个字符串文字会将字符串的数据复制到数组中,并且由于您的代码中没有 const 的东西,因此数组必须是可变的,因此存储在 char 数组中的字符串是可变的也是。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2021-03-30
    • 1970-01-01
    • 2013-04-30
    • 2018-01-28
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多