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