Objective c 将指针分配给另一个指针会崩溃
我试图将指针y分配给指针x,*x=*y,但是如果testChar是指针,它就会崩溃Objective c 将指针分配给另一个指针会崩溃,objective-c,c,xcode,pointers,llvm,Objective C,C,Xcode,Pointers,Llvm,我试图将指针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,那么它工作得很好。有人能解释一下区别吗?字符串“abc”存储在只读存储器(程序的二进制文件)中。因此,您试图修改只读数据
char *testChar = "abc";
char *x = testChar;
char *y = testChar + 1;
char temp;
temp = *x;
*x = *y;
*y = temp;
如果我将代码更改为char testChar[]而不是*testChar,那么它工作得很好。有人能解释一下区别吗?字符串“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
相同)。字符串“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
相同)。*x=*y代码>?o、 另外,SO中对此进行了广泛讨论。您的testChar
应该是const
,因为它指向一个只读对象字符串文本。但是,在中,您可以使用const
来防止意外修改您不想修改的内容,但最终您有责任阻止它;char*x=testChar;char*y=testChar+1;焦炭温度;温度=*x*x=*y*y=温度;这个程序有助于交换。我在极客中的极客中找到了它。我还没有玩过c中的字符数组。听不懂it@Sujananth你自己找到了解决办法。您需要什么?无法理解为什么它会崩溃*x=*y代码>?o、 另外,SO中对此进行了广泛讨论。您的testChar
应该是const
,因为它指向一个只读对象字符串文本。但是,在中,您可以使用const
来防止意外修改您不想修改的内容,但最终您有责任阻止它;char*x=testChar;char*y=testChar+1;焦炭温度;温度=*x*x=*y*y=温度;这个程序有助于交换。我在极客中的极客中找到了它。我还没有玩过c中的字符数组。听不懂it@Sujananth你自己找到了解决办法。您在这里需要什么?无法理解为什么会崩溃。我假设应该手动释放由strdup
返回的内存?我会将它添加到代码中。@freeinkname true。我已经更新了答案。另外,不要假设strdup()
返回了有效的指针。检查实代码中的NULL
。也不要假设strdup存在,因为它不是标准的。首先,这里没有明显的理由使用堆分配。另外,不要回答这个非常常见的常见问题,但请重复回答。您必须使用printf(“%c”)而不是%s打印。%s在下一个\0字符处停止*x和*y仅存储一个字符。y指向第二个字符,x指向第一个字符。这一点没有改变。我假设strdup返回的内存应该手动释放?我会将它添加到代码中。@freeinkname true。我已经更新了答案。另外,不要假设strdup()
返回了有效的指针。检查实代码中的NULL
。也不要假设strdup存在,因为它不是标准的。首先,这里没有明显的理由使用堆分配。另外,不要回答这个非常常见的常见问题,但请重复回答。您必须使用printf(“%c”)而不是%s打印。%s在下一个\0字符处停止*x和*y仅存储一个字符。y指向第二个字符,x指向第一个字符。这一点没有改变。