首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能为数组分配更长的字符串吗?

我们能为数组分配更长的字符串吗?
EN

Stack Overflow用户
提问于 2018-12-08 12:05:51
回答 2查看 88关注 0票数 0

在网上阅读后,我知道以下是C中未定义的行为:

  1. 访问外部数组元素 char a24 = {'g','e','e','k','s'};printf(" a24 :%d,%c\n",a24,a24);// a2的最后一个索引是3/so a24是未知的
  2. 在数组中有多余的元素 int arr3 = {1,2,3,4,5};// arr的大小为3,但我们指定了5个元素//未定义的行为

我想问一下,在以下相关场景中,涉及指针和字符串的行为是否未定义:

  1. 将较长的字符串分配给字符数组: char arr5 =“极客”;//“极客”包含6个字符,包括\0 //但arr的大小为5。
  2. 使用指针访问更远的索引。 char * arrptr = arr;//变量arr从第1点开始 或 char * arrptr =“极客”; 然后做 printf("%c",arrptr7); 我认为这肯定是没有定义的,因为在当前的情况下,指数7不属于任何东西。

有人能澄清这一点或指出C标准的相关章节吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-08 12:34:43

代码语言:javascript
复制
char arr1[5] = "geeks"; // extra '\0': ok
char arr2[4] = "geeks"; // extra 's' and '\0': error

'\0'作为额外元素初始化char数组是一个特例。参见C11 6.7.9p14 (重点是我的)

字符类型的数组可以由字符串文字或UTF-8字符串文字初始化,也可以用大括号括起来。字符串文字的连续字节(,包括终止空字符,如果有房间或数组大小未知)初始化数组的元素。

票数 2
EN

Stack Overflow用户

发布于 2018-12-08 12:18:04

  1. char arr[5] = "geeks"; // ok

这个语句本身并不是UB。它只是初始化一个char数组(而不是字符串)。

但是,当您开始将它与类似于printf的东西一起使用时,它将变成一个UB:

代码语言:javascript
复制
`printf("%s", arr);  // UB`
  1. 对于你的第二点来说,这肯定是UB,因为你正在访问超出范围的 printf("%c",arrptr[7]); // UB
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53682351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档