【问题标题】:Passing char pointer as argument to function [duplicate]将char指针作为参数传递给函数[重复]
【发布时间】:2015-01-23 11:15:23
【问题描述】:

此 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));
        }
    }
}

【问题讨论】:

  • 因为字符串文字是一个常量。没有教程/参考/语言书告诉你吗?这已经被问了数百次了。

标签: c


【解决方案1】:

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__"; 

【讨论】:

  • @Sadique 我尝试了这种方法,当我将 char* t 发送到函数时, arr[] 不会改变。有什么想法吗?
【解决方案2】:

崩溃与存储字符串字符的内存类型有关,与您是否将其声明为字符数组或指针无关。换句话说,您可以保留指针,并将字符串复制到其中,如下所示:

int main()
{
    char *s = strdup("ABC");
    printAnagram(s, 0, 2);
    free(s);
    return 0;
}

C 标准认为分配给字符串文字的内存,例如"ABC",是不可写的。因此,您对它们所做的任何更改都会导致未定义的行为。当您将声明更改为数组时,C 会将文字复制到可写内存中,因此没有未定义的行为(也没有崩溃)。

【讨论】:

  • 很有帮助,谢谢
【解决方案3】:

char *s = "ABC"; 是存储在read only memory 位置的字符串文字。当您尝试修改它时,是的,它会崩溃。事实上它是const char *s。相反,您应该像已经提到的那样使用,

char s[] = "ABC"; 

查看之前的 SO 答案 Modifying a string literal

【讨论】:

    【解决方案4】:

    您正在访问只读存储器。

    char *a="ABC";// It will stored in the read only memory. 
    

    如果您试图访问它,您将无法做到。你可以这样使用。

    char array[]="ABC";
    char *a=array;
    

    【讨论】:

    • 不,他不必动态分配。初始化一个自动数组非常好。
    【解决方案5】:

    您可以尝试声明一个 char 数组,例如 char [6] str="ABC";,然后使用 char 指针来管理该数组:char *p=&amp;str; 崩溃是由于您指向堆栈内存中不存在的字符串的指针。

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 2015-03-17
      • 2021-09-07
      • 1970-01-01
      • 2014-11-04
      • 2016-03-27
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多