将char指针作为参数传递给函数

时间:2015-01-23 11:15:24

标签: c

这个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));
        }
    }
}

5 个答案:

答案 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; 崩溃的原因是你的指针指向堆栈内存中不存在的字符串。