AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76930988
Accepted
John Peters
John Peters
Asked: 2023-08-19 00:10:34 +0800 CST2023-08-19 00:10:34 +0800 CST 2023-08-19 00:10:34 +0800 CST

为什么 C 字符串并不总是等同于字符数组?

  • 772

假设 C 字符串是一个以 null 结尾的字符数组:

const char str1[] = {"abc"};
const char str2[] = {'a', 'b', 'c', '\0'};
const char str3[] = {97, 98, 99, '\0'};

是相同的。

那么为什么可以生成这样的字符串数组:

const char * str_arr[] = {"abc", "ABCD"};
const char * str_arr[] = { str1, str2, str3 };

但不是这样的?:

const char * str_arr[] = { {'a', 'b', 'c', '\0'}, {'A', 'B', 'C', 'D', '\0'} };
fatal error: excess elements in scalar initializer
arrays
  • 2 2 个回答
  • 69 Views

2 个回答

  • Voted
  1. Best Answer
    Eric Postpischil
    2023-08-19T00:51:16+08:002023-08-19T00:51:16+08:00
    const char str1[] = {"abc"};
    const char str2[] = {'a', 'b', 'c', '\0'};
    const char str3[] = {97, 98, 99, '\0'};
    

    这些之所以有效,是因为 C 2018 6.7.9 中关于如何处理初始化器的规则:

    • 在 中const char str1[] = {"abc"};,给出了一个字符串文字来初始化 的数组const char。6.7.9 14 说“字符类型数组可以由字符串文字或 UTF-8 字符串文字初始化,可以选择用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。”
    • 在 中const char str2[] = {'a', 'b', 'c', '\0'};,给出了一个值列表int(字符常量的类型为int)来初始化数组。6.7.9 17 告诉我们这些用于按顺序初始化数组的子对象(其元素)。
    const char * str_arr[] = {"abc", "ABCD"};
    const char * str_arr[] = { str1, str2, str3 };
    

    对于这些:

    • 在 中const char * str_arr[] = {"abc", "ABCD"};,字符串文字列表用于初始化指针数组。请注意,这不是用大括号括起来的字符串文字;它是两个字符串文字,因此与上面的规则不匹配。对于使用字符串文字来初始化指针数组而不是字符类型数组没有特殊规则,因此使用 C 的其他规则进行处理,并且两个字符串文字初始化数组的两个元素。字符串文字指定字符数组。6.3.2.1 3 表示当数组不是 的操作数时sizeof,一元的操作数&或用于初始化数组的字符串文字,它会转换为指向其第一个元素的指针。因此,这两个数组(由字符串文字指定的数组)中的每一个都被转换为指向其第一个元素的指针,并且这些指针成为 的初始值str_arr。
    • const char * str_arr[] = { str1, str2, str3 };、str1、str2、中str3是数组。如上所述,它们会自动转换为指向其第一个元素的指针,并且这些指针用于初始化str_arr。
    const char * str_arr[] = { {'a', 'b', 'c', '\0'}, {'A', 'B', 'C', 'D', '\0'} };
    

    为此, 的每个元素str_arr都是 a const char *,为其提供的初始值设定项是{'a', 'b', 'c', '\0'}。C 中没有规定 aconst char *可以用大括号中的值列表来初始化int。当{'a', 'b', 'c', '\0'}出现在初始化器中时,它作为数组没有任何特殊含义。它只是一个值列表。如何处理该值列表取决于初始化的上下文。如果有一个要填充的数组,则可以使用列表中的值来填充数组元素。但是没有数组,也没有规则说这个值列表被制作成一个数组并创建一个指向该数组的指针。

    • 3
  2. Siguza
    2023-08-19T00:21:16+08:002023-08-19T00:21:16+08:00

    实际上可以,如果你将它们投射到const char []:

    const char * str_arr[] = { (const char []){'a', 'b', 'c', '\0'}, (const char []){'A', 'B', 'C', 'D', '\0'} };
    

    const char *你不能用 s数组来初始化 的类型char(因为指针在哪里?),但你可以用它来初始化 的类型const char[],并让它衰减为const char *。

    • 0

相关问题

  • PowerShell:如何像这样转换 hastable 数组值?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve