【问题标题】:char* and char[] with strcat()char* 和 char[] 与 strcat()
【发布时间】:2020-09-28 05:17:28
【问题描述】:

我的问题是char *string1 不能被修改,那么为什么他们有类似的语法

char *strcat(char *string1, const char *string2) ??
#include<stdio.h>
#include<string.h>

int main(void)
{
        const char *p="Everyone";
        char *a="Hello ";
        printf("%s",strcat(a,p));
        return 0;
}

输出:分段错误(核心转储)

#include<stdio.h>
#include<string.h>

int main(void)
{
        const char *p="Everyone";
        char a[20]="Hello ";
        printf("%s",strcat(a,p));
        return 0;
}

输出:大家好

在sn-p 1中,char*存储在只读内存中,所以我们不能修改(这里修改是连接)我认为这就是它显示分段错误的原因

strcat() 的语法是char *strcat(char *string1, const char *string2)

【问题讨论】:

  • 那么问题是什么?
  • 有什么问题?在第一个示例中,您尝试修改字符串文字,这会导致未定义的行为。真的没什么好说的了。

标签: c string pointers


【解决方案1】:

问题不在strcat。问题是 C90,由于向后兼容性,决定将 string literals 键入为非常量字符的数组,但在尝试修改字符时指定 behaviour在上述数组中将是未定义的。毕竟,整个const 关键字是在 80 年代引入的,是从 C++ 采用的!

即使在今天,许多编译器,如 GCC,都有一个(有问题的)选项 -fwritable-strings,它使字符串文字可修改,就像在一些早期的 C 编译器中一样。


请注意,没有什么能阻止你写作

const char *a = "Hello ";

然后strcat 会大声抱怨。

【讨论】:

    【解决方案2】:

    我的问题是char *string1 不能被修改,那么为什么他们有类似的语法

       char *strcat(char *string1, const char *string2) ??
    

    嗯,这取决于您作为第一个参数传递给调用的参数。确保将第一个参数作为指向内存的指针传递是程序员的功能要求和责任

    • 可以修改(可写)
    • 有足够的内存来存储连接的值。

    函数签名很好,它接受一个指向 char 的指针(数组,根据要求足够长)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多