c - 带大括号的字符串初始值设定项

标签 c arrays string

我遇到了一段进行以下初始化的代码:

static const uint8_t s[] = {"Some string"};

我希望它被解释如下:右侧匹配一个 char 指针数组和一个指向字符串文字“Some string”的元素。而左边部分是一个uint8_t数组。那么我期望的行为是 s 的第一个元素接收指向字符串文字的指针的一些截断值,从而在以下代码中导致意外行为,假设 s 是一个字符串。

我做了如下测试代码:

#include <stdint.h>
#include <stdio.h>

static const uint8_t s1[] = "String1";
static const uint8_t s2[] = { "String2" };
int main(void){

    printf("%p, %p\n", s1, s2);
    printf("%s, %s\n", s1, s2);

    return 0;
}

令我惊讶的是,这似乎并没有发生。不仅代码可以正常工作,而且反汇编显示 s1s2 都以相同的方式初始化为相应的字符串。

这是 gcc 特有的吗? C 语法是否允许将单个字符串文字放入 {} 并仍然将其解释为字符串文字?

最佳答案

引自N1570(C11终稿),6.7.9 Initialization(重点是我的):

  1. An array of character type may be initialized by a character string literal or UTF-8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

关于c - 带大括号的字符串初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431081/

相关文章:

C自定义malloc函数不读取 block 大小

c - getrusage 的大部分字段应该为 0 吗?

javascript - 如何通过 Jquery/Javascript 知道以 px 为单位的占位符字符串宽度?

c++ - "Why switch statement cannot be applied on strings?"的答案是否仍然正确,即使使用 C++11/14?

python - 如何在Python中删除数据框中单词的精确匹配?

c - 带参数和不带参数的函数 XOpenDisplay

c - 了解返回值函数 C

java - 为什么 ArrayList 的 ArrayList 不是多维的?

javascript - 如何过滤 native react 中的对象数组?

c# - 如何将多个对象添加到单个数组?