这个porgram打印字符串的不同排列。如果我在main中将字符串声明为char数组并在printAnagram函数中传递数组名称,它可以正常工作。但是如果我将字符串声明为 char * s =“hello”并传递's'然后它崩溃了。为什么呢?
#include <stdio.h>
#include <conio.h>
void printAnagram(char *str, int b, int e);
int main()
{
char *s = "ABC"; // works fine when char s[] = "ABC" is used.
printAnagram(s, 0, 2);
return 0;
}
void swap(char *a, char* b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void printAnagram(char *str, int b, int e)
{
int i = 0;
if(b==e)
printf("%s\n", str);
else
{
for(i=b;i<=e;i++)
{
swap((str+b),(str+i));
printAnagram(str, b+1, e);
swap((str+b), (str+i));
}
}
}
答案 0 :(得分:3)
在char *s = "ABC";
中 - "ABC"
是一个字符串文字,修改它是UB。
指针通常用于指向已存在的数据,因此您可以像这样使用它
char arr[] = "C__";
char* t = &arr[0];
也可以修改,
t[1] = 'p';
t[2] = 'p';
这里
char *t= "C__";
指向字符串常量。
有一种更好的方式来编写上述内容:
const char* t= "C__";
答案 1 :(得分:2)
崩溃与存储字符串字符的内存类型无关,而与是否将其声明为字符数组或指针有关。换句话说,您可以保留指针,并将字符串复制到其中,如下所示:
int main()
{
char *s = strdup("ABC");
printAnagram(s, 0, 2);
free(s);
return 0;
}
C标准考虑分配给字符串文字的内存,例如"ABC"
,不可写。因此,您对它们所做的任何更改都会导致未定义的行为。当您将声明更改为数组时,C将文本复制到可写内存中,因此没有未定义的行为(并且没有崩溃)。
答案 2 :(得分:1)
char *s = "ABC";
是存储在read only memory
位置的字符串文字。当你尝试修改它时,它会崩溃。实际上它是const char *s
。相反,你应该像已经提到的那样使用,
char s[] = "ABC";
看看之前的SO回答Modifying a string literal。
答案 3 :(得分:0)
您正在访问只读内存。
char *a="ABC";// It will stored in the read only memory.
如果您尝试访问此功能,则无法执行此操作。你可以这样使用。
char array[]="ABC";
char *a=array;
答案 4 :(得分:0)
您可以尝试声明一个char数组,例如char [6] str="ABC";
,然后使用char指针来管理该数组:char *p=&str;
崩溃的原因是你的指针指向堆栈内存中不存在的字符串。