连接字符串 - 需要说明

标签 c

char * a = (char *) malloc(10);
    strcpy(a,"string1");
    char * x = "string2";
    strcat(a,x);
    printf("\n%s",a);

这里,我只给a分配了10B,但是在连接ax(合并大小为16B)之后,C打印了毫无问题地回答。

但是如果我这样做:

    char * a = "string1";
    char * x = "string2";
    strcat(a,x);
    printf("\n%s",a);

然后我得到一个段错误。为什么是这样?为什么第一个在内存分配较低的情况下仍然有效? strcat 是否为我重新分配内存?如果是,为什么第二个不起作用?是因为 ax 以这种方式声明的是不可修改的字符串文字吗?

最佳答案

在您的第一个示例中,a 分配在堆中。因此,当您连接另一个字符串时,堆中的某些内容将被覆盖,但没有写保护。

在您的第二个示例中,a 指向包含常量的内存区域,并且是只读的。因此出现段错误。

关于连接字符串 - 需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531337/

相关文章:

c - 获取无线OCB模式下接收包的信号强度

c - 字符串到 ASCII 代码的转换并绑定(bind)它们

c++ - 为什么芯片控制语言选择

c - 有没有关于 c 语言从语言到语言的 iconv 音译的简单示例?

c - 一般使用编译时已知的可变大小数据。

php - 在 C 中自定义 PHP 扩展中的段错误实例化类

c++ - 将未初始化的变量传递给 srand 是个好主意吗?

关于指针和数组的混淆

c - 在 C 中使用 MPI_Type_vector 接收

c - do while 1-4 菜单循环不断重复非数字输入