【问题标题】:character pointer字符指针
【发布时间】:2012-02-19 09:07:23
【问题描述】:

为什么这段代码不起作用?

int main(){
  char *str ="abcde";
   scanf("%s",str);
  printf("%s",str);
}

但这有效吗?

int main(){
  char str[] ="abcde";
   scanf("%s",str);
  printf("%s",str);
}`

【问题讨论】:

标签: c string


【解决方案1】:

在第一个代码中,您声明了一个指向string literal 的指针:"abcde"
这可能是一个常数,您将无法更改它。

第二个代码是声明一个数组并用['a','b',c','d','e','\0']填充它,它不是一个常量——所以你可以改变它。

【讨论】:

  • str[] case 的输入是否可以采用比它初始化的大小更多的值(在这种情况下为 6)。
  • @gaurav:我不明白这个问题[在评论中],你能澄清一下吗?
  • 我想他是在问数组大小是否为 6,输入是否可以超过 6 个字符。答案是肯定的,您必须仔细检查。
  • 是的。我问的是因为我们没有在这里指定大小..它似乎可以接受更多的字符,因为没有更多的空闲连续空间
  • @gaurav:保证您拥有字符串大小的数组[包括'\0']。除此之外的一切 - 都是未定义的行为 - 它可能会起作用,也可能会失败。
【解决方案2】:

因为char *str ="abcde"; 是一个指向字符串字面量的指针,它很可能存储在只读内存中。

char str[] ="abcde"; 是一个用"abcde" 初始化的数组。

您还应该查看Difference between char* and char[]

【讨论】:

  • 字符串文字不是const。它们只是(可能)处于只读状态。
  • “一个普通的字符串字面量的类型是“n const char数组”和静态存储时间。”
  • 这是 C++ 标准。我们在谈论 C。见stackoverflow.com/a/2245983/1055952
  • @asaelr:不错。我认为它在 C 中是一样的。我已经编辑了我的答案,现在应该可以了。
  • 请注意,这里的“只读存储器”可能并不意味着硬件 ROM;它更有可能只是被操作系统写保护的一段内存。 (虽然它可能是嵌入式系统上的实际 ROM。)
【解决方案3】:

当字符串值直接赋值给一个指针时,它存储在一个 之间共享的只读块(通常在数据段中) 功能

char *str  =  "GfG";

...

char str[] = "GfG";  /* Stored in stack segment like other auto
variables */  *(str+1) = 'n';   /* No problem: String is now GnG */

http://www.geeksforgeeks.org/archives/5328

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多