c - C函数在char [] segfaults中交换两个char,尽管不使用字符串文字

标签 c string swap

我已经在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;
   }

最佳答案

char *string = "abcd";

是指向字符串文字的指针,字符串文字在C中是不可变的。修改字符串文字会引起 undefined 的行为。

string的声明更改为:
char string[] = "abcd";

修复您的程序。这里string是一个数组,使用字符串文字的内容初始化并且可以修改。

关于c - C函数在char [] segfaults中交换两个char,尽管不使用字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935639/

上一篇:C宏连接

下一篇:PHP SDK - Facebook 注销

相关文章:

c - : if ( test == ( void * ) -1 )中的 "( void * ) "是什么意思

c++ - 如何只从几个 C++ 字符串中获取第一个单词?

java - Java中的正则表达式

javascript - 交换对象数组中的元素

c - recv() 在读取响应数据时中途停止 [C]

c++ - 从缓冲区指针计算堆栈中的返回地址

java - 从 URL 中删除不需要的字符

c++ - std::swap 在构造函数、赋值运算符和析构函数方面如何工作?

java - 交换 LinkedBag 中的三个元素。即ABC==BCA

c - 如何使用带位域的结构