【问题标题】:C function to swap two chars in a char[] segfaults, despite not working with string literals尽管不使用字符串文字,但 C 函数在 char[] 段错误中交换两个字符
【发布时间】:2013-07-29 23:00:38
【问题描述】:

我已经在 GDB 中验证了程序在 *(a) = *(b) 行上崩溃了。这对我来说没有意义。

在我的主函数中,我为 char* 字符串分配了 5 个字节。我将两个指针传递给交换,一个是由 sizeof(char) 偏移的字符串,另一个是指向字符串的指针。这些指针被复制到 swap() 的调用堆栈。我之前分配的 5 个字节应该仍然在堆栈上,所以 swap() 在解除引用和写入堆栈上的这些位置时应该没有问题,对吧?

  int main(int argc, char* argv[])
  {
      char *string = "abcd";
      swap((string+1), string);
      printf("%s\n",string);
      return 0;
  }

  void swap(char *a, char *b)                                                                                                                                                                       
  {
       if(!a || !b)
           return;

       char temp = *(a);
       *(a) = *(b);
       *(b) = temp;
   }

【问题讨论】:

  • 这和你的问题无关,但是*(a)括号过大,*a就够了。
  • 我很困惑。你认为你在哪里为字符串分配了五个字节,这怎么不是字符串文字的使用?
  • @elchonon-edelson 我认为原始发帖人对 char* 是什么的理解不正确,因为它的字节被复制到堆栈中,而不仅仅是一个 char 指针。

标签: c string swap


【解决方案1】:
char *string = "abcd";

是指向字符串文字的指针,而字符串文字在 C 中是不可变的。修改字符串文字会调用未定义的行为。

string的声明改为:

char string[] = "abcd";

修复你的程序。这里string是一个数组,用字符串字面量的内容初始化,可以修改。

【讨论】:

  • 够疯狂的,但我不知道 C 语言中会出现这种情况,谢谢。
【解决方案2】:

"abcd" 这样的字符串文字是只读的,您不能更改它们。使用

char string[] = "abcd";

改为。

【讨论】:

  • 您可以使用常规字符串文字初始化char[],它仍然是可写的。您不必写出{ 'a', 'b', 'c', 'd' }。 (除非你真的不想要终止 NUL,它偶尔会出现。)
【解决方案3】:

你应该使用char string[] = "abcd";,因为char* string= "abcd";中的字符串是不可变的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2017-10-26
    相关资源
    最近更新 更多