2

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

3 回答 3

5
char *string = "abcd";

is a pointer to a string literal and string literals are immutable in C. Modifying a string literal invokes undefined behavior.

Change the declaration of string to:

char string[] = "abcd";

to fix you program. Here string is an array, initialized with the content of a string literal and is modifiable.

于 2013-07-29T23:02:07.217 回答
3

String literals like "abcd" are read only, you must not change them. Use

char string[] = "abcd";

instead.

于 2013-07-29T23:02:35.170 回答
0

你应该使用char string[] = "abcd";,因为字符串在char* string= "abcd";

于 2013-07-31T02:30:00.737 回答