我对使用C语言中的指针有点陌生。因此,我一直试图适应它们。所以我想做的就是使用指针交换两个字符串的第一个字符。这是我想出的]
#include <stdio.h>
void swap_first_char(char *s1, char *s2) {
char temp = *s1;
*s1 = *s2;
*s2 = temp;
}
int main() {
char *str1 = "ASTRING";
char *str2 = "BSTRING";
swap_first_char(str1,str2);
printf("str1 = %s, str2 = ‰s\n", str1, str2);
return 0;
}
所以,这是我现在的理解。 str1和str2保存“ ASTRING”和“ BSTRING”的第一个字符的地址。因此,当我将它们传递给swap_first_char(char*, char*);
函数时,现在s1保存字符串“ ASTRING”的第一个字符的地址,而s2保存字符串“ BSTRING”的第一个字符的地址。因此,我可以取消引用它们并交换它们以交换两个字符串的第一个字符,对吗?
但是在执行这段代码时,我总是遇到分段错误。如果有人能告诉我为什么,我将不胜感激。谢谢^ _ ^
将其扩展为一个我可以使用一些代码的答案:字符串常量-带引号的字符串-通常(但不是必须)是只读的,从某种意义上说,编译器允许您将其中的一个分配给它是一个肮脏的技巧。一个char *
(将允许您对其进行写操作),而不是const char *
(这将禁止它进行写入)。
替换
char *str1 = "ASTRING";
char *str2 = "BSTRING";
with
char str1[] = "ASTRING";
char str2[] = "BSTRING";
实际上可以解决问题(正如我在使用gcc的x86系统上测试的那样)。在后一种情况下,编译器将分配字符串的完整数组(加上NUL字节),而在前一种情况下,它只是指向在其他位置分配的字节的指针。