【问题标题】:Assigning a pointer to another pointer crashes [duplicate]将一个指针分配给另一个指针会崩溃 [重复]
【发布时间】:2018-04-19 10:51:50
【问题描述】:

我正在尝试将指针 y 分配给指针 x,*x = *y 但如果 testChar 是指针,它会崩溃。

char *testChar = "abc";
char *x = testChar;
char *y = testChar + 1;
char temp;
temp = *x;
*x = *y;
*y = temp;

如果我将代码更改为 char testChar[] 而不是 *testchar 它工作得很好。谁能解释一下这些区别?

【问题讨论】:

  • *x = *y;? o.O
  • 另外,这在 SO 中得到了广泛的讨论。您的 testChar 应该是 const 因为它指向一个只读对象的字符串文字。但是,在c 中,您可以使用const 来防止意外修改您不想修改的内容,但防止它最终是您的责任。
  • char testChar[] = "abc";字符 *x = 测试字符;字符 *y = testChar + 1;炭温度;温度 = *x; *x = *y; *y = 温度;这个程序帮助交换。我在极客的极客中找到了它。我没有在c中玩过字符数组。看不懂
  • @Sujananth 你自己找到了解决方案。你在这里需要什么?
  • 无法理解为什么会崩溃

标签: objective-c c xcode pointers llvm


【解决方案1】:

字符串“abc”存储在只读存储器(程序的二进制文件)中。因此,您正在尝试修改只读数据,这是不可能的。

相反,您可以这样做:

char *testChar = strdup("abc"); // allocate new (writable) memory and copy this const string there.
char *x = testChar;
char *y = testChar + 1;
char temp;
temp = *x;
*x = *y;
*y = temp;

请注意,testChar 指向您在不再需要时负责释放的内存(与 malloc 相同)。

【讨论】:

  • 我假设strdup返回的内存应该手动释放?我会把它添加到代码中。
  • @FreeNickname 真实。我已经更新了我的答案。
  • 另外,不要假设strdup() 返回了一个有效的指针。在实际代码中检查NULL
  • 也不要假设 strdup 存在,因为它不是标准的。首先没有明显的理由在这里使用堆分配。也不要回答这个非常常见的常见问题解答,而是重复关闭。
  • 您必须使用 printf("%c") 而不是 %s 进行打印。 %s 在下一个 \0 字符处停止。 *x 和 *y 只存储一个字符。 y 指向第二个字符,x 指向第一个字符。这没有改变。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多