【问题标题】:Strings As Arrays in c字符串作为c中的数组
【发布时间】:2018-03-17 05:51:59
【问题描述】:

我是 c 新手,我试图做一些简单的事情来了解字符串和字符数组,但我被困在这部分代码中。

 const char *words(int count) {
  char *words = "words";
  if(count==1) {
    words[strlen(words)-1] = '\0';// segmentation fault
  }
  return words;
}    

它的作用是在 count 等于 1 时返回 word,否则返回 word。 我的问题是为什么这行代码有问题,为什么我不能将字符串视为 char 的数组

words[strlen(words)-1] = '\0';

我尝试以不同的方式声明字符串(字符数组),例如
char *words = {'w','o','r','d','s'}; 但我仍然遇到分段错误。

【问题讨论】:

标签: c arrays string segmentation-fault


【解决方案1】:

ISO/IEC 9899:TC3 N1256
6.7.8 初始化——32、示例8 声明

char s[] = "abc", t[3] = "abc";

定义“普通”字符数组对象 s 和 t,其元素为 用字符串文字初始化。这个声明是 等同于

char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };

数组的内容是可以修改的。另一方面,声明

char *p = "abc";

定义 p 类型为 ‘‘pointer to char’’ 并将其初始化为指向 类型为“char 数组”的对象,长度为 4,其元素为 用字符字符串文字初始化。 如果尝试 使用 p 来修改数组的内容,行为是 未定义


简而言之,您尝试修改声明为char * words = "words"words 指向的内容,而字符串文字"words" 通常存储在只读部分中,这就是您获得SEGSEV 的原因。

【讨论】:

  • "如果尝试使用 p 修改数组的内容,则行为未定义。"我明白了......这是问题,但你的建议没有帮助,我想返回数组单词,但我不能将单词作为局部变量返回,解决方案是在堆中声明它但我不知道其他方式使用指针,我可以在这里使用 malloc/calloc 吗?有必要吗?
  • 哦,我没注意到你想返回一个数组。是的 malloc 是必要的
猜你喜欢
  • 2014-07-03
  • 2018-04-02
  • 1970-01-01
  • 2021-06-28
  • 2022-01-18
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多