【问题标题】:What's the difference between defining a string as an array or as a char pointer?将字符串定义为数组或字符指针有什么区别?
【发布时间】:2020-01-19 12:14:44
【问题描述】:

当我执行下面的代码时,

#include <stdio.h>
#include <string.h>
int main ( ){
    char string [] = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));
    }

输出是“Sweet Home Home”。

但是; 当我更改如下代码时,

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

int main ( )
{
    char* string = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));

}

它给出了分段错误。

当我将此数组定义为 char 指针时会发生什么变化?

【问题讨论】:

  • string 在第二种情况下指向不应尝试更改的内存。
  • 但是对于你所说的,我不应该在一开始就使用 const 吗?
  • 任何修改文字字符串的尝试都会导致未定义的行为。在第二种情况下,您的指针 string 指向此类文字字符串的第一个字符。这就是建议所有此类指针为const 的原因,如const char *string
  • @burr4ch 除了将它们复制到您自己定义的数组中,然后修改您自己的数组?不,没有办法。
  • burr4ch,“将字符串定义为数组或字符指针的区别?”暗示误解。 string 不是指针。指向 strings 的指针通常在第二种情况下使用 - 在这种情况下不正确。 “当我将此数组定义为 char 指针时”也有问题--> 数组不是指针,指针也不是数组。

标签: c arrays string char


【解决方案1】:

当我将此数组定义为 char 指针时会发生什么变化?

在这种情况下最重要的是:数据的可变性发生了变化。

char string [] = "Home Sweet Home";

这里的"Home Sweet Home" 是数组stringinitializer。它用带有零终止字符的字符初始化字符串。数组大小是从初始化程序中推断出来的,(如果我算对的话)是 16 个字符。数组string 被声明为char,所以它是可变的,你可以改变它。

char* string = "Home Sweet Home";

这里的"Home Sweet Home"string literal。字符串字面量是不可变的、不可修改的、不可修改的。指向字符串文字的指针存储在string 指针中。修改字符串文字会导致未定义的行为。分段错误是当程序访问不允许访问的内存位置时的错误。在这种情况下,程序会尝试写入不允许修改的内存位置。

【讨论】:

  • 详细信息:“字符串文字......无法修改。”和“修改字符串文字会导致未定义的行为。”有冲突。试图修改的是UB。它可能会工作,可能不会,可能会崩溃,......它是 UB。
  • chux 是正确的,重要的是要使语义正确。 C 标准说它没有定义尝试修改字符串文字的行为。告诉某人它是不可变的,可能会导致他们在诊断 C 实现中的错误时做出不正确的推论,其中实现不会阻止修改字符串文字。不加限定地断言字符串文字是不可变的、不可修改的或不可修改的都是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2011-03-26
相关资源
最近更新 更多