C 我可以将字符串存储在长度为1的字符数组中吗

C 我可以将字符串存储在长度为1的字符数组中吗,c,C,我是一个熟悉Java的程序员。但是我很难理解C的一些概念 我在网上遇到一些C代码,它将字符串存储在长度为1的字符数组中 char a[0] = 'abcd'; 在Java中。这根本不可能。但是有人能告诉我这在C语言中是否可行吗 如果是,请简要说明 在java中,如果需要存储字符串数组,我会这样做 String[] a = new String[1]; a[0] = "text"; 现在,我需要在C中做这件事,数组大小为1。在C中,字符串是以NUL字符结尾的char数组char*大致对应于Ja

我是一个熟悉Java的程序员。但是我很难理解C的一些概念

我在网上遇到一些C代码,它将字符串存储在长度为1的字符数组中

char a[0] = 'abcd';
在Java中。这根本不可能。但是有人能告诉我这在C语言中是否可行吗

如果是,请简要说明

在java中,如果需要存储字符串数组,我会这样做

String[] a = new String[1]; a[0] = "text";

现在,我需要在C中做这件事,数组大小为1。

在C中,字符串是以NUL字符结尾的
char
数组char*大致对应于Java中的
String

做C等价的
String[]a=新字符串[1];[0]=“字符串”在C中,您可以执行以下操作:

char *a[1];   // this will be stored on the stack so there's no need to allocate memory.
a[0] = "string";

可以将字符串存储在长度为1的
char
数组中,但必须为空:

char a[1] = "";
终止空字符是唯一可以存储的内容

如果要在C中执行字符串数组,请执行以下操作:

char *a[1]; a[0] = "text";

不,不可能。 事实上,你发布的代码有很多错误之处

首先,您不能声明大小为零的字符数组,因为所有字符数组(即字符串)都是
NULL
终止的,这意味着它们以一个完整的零字节结尾,因此即使您希望有一个空字符串,您也可以这样做

char-empty[1]=“”

而且,在C语言中,
char
string
之间存在着具体的区别。字符写为
'a'
,字符串写为
“thisastring”
,而在其他编程语言(如Python)中没有这种区别

您可以做些什么,但要小心,因为这只在声明变量时起作用,继续您的示例就是如下声明它

chars[]=“abcd”

如果您想深入了解,可能应该查找有关
malloc()
函数的信息。

以下几点:

  • 'abcd'
    不是字符串-它是一个多字节字符常量,其行为完全特定于实现。注意,在C中,像
    'A'
    '\n'
    这样的字符常量的类型是
    int
    ,而不是
    char
  • 声明
    char a[0]
    无效-如果数组大小使用常量表达式(如此处所示),则它必须大于0。这是一个约束冲突,编译器需要发出诊断(尽管它不必停止转换)。
  • 字符串是包含0值终止符的字符值序列。字符串存储在字符类型的数组中(对于“宽”字符串,
    char
    wchar\u t
    ),并且数组必须足够大以容纳0终止符-注意,N个字符的字符串需要至少N+1个字符宽的数组来存储。
  • C不要求对数组写入或访问进行任何边界检查。如果试图将100个字符的字符串存储到一个只有10个元素宽的数组中,那么这些额外的90个字符将在数组结束后立即写入内存,这可能会破坏一些重要的内容。您将不会得到ArrayOutOfBounds异常。根据被覆盖的内容,可能会出现运行时错误。
  • “Hello”
    这样的字符串文本在程序启动时为它们预留了存储空间,并一直保留到程序终止。字符串文本应该是不可变的(就像Java中的字符串一样),但在某些平台上,字符串文本的存储是可写的。试图修改字符串文字内容的行为是未定义的——这是错误的,但编译器不需要以任何特定方式处理它。它可能会按预期工作,可能会保留未修改的字符串,可能会崩溃,可能会得到诊断,编译器可能会停止翻译,等等。 因此,总之,在1个元素宽的字符数组中只能存储空字符串(即0终止符)

    根据您的评论:

    在java中,如果我需要存储字符串数组,我会这样做<代码>字符串[]a=新字符串[1];[0]=“文本”现在,我需要在C中完成这项工作,数组大小为1

    C中的等效值为:

    char *a[1];                             // a is a 1-element array of *pointer* to char
    a[0] = malloc( strlen( "text" ) + 1 );  // malloc allocates memory from the heap and returns its address
    if ( a[0] )
      strcpy( a[0], "text" );               // copy the contents of the literal to the heap memory
    
    在这里,您从堆中分配一些内存,将新分配内存的地址存储到
    a[0]
    ,然后将字符串literal
    “text”
    复制到新的缓冲区中。由于C不执行自动垃圾收集,因此在使用完后,您需要手动释放该内存:

    free( a[0] );
    

    您的文本显示长度为1,但数组的声明长度为0,这是无效的。而
    'abcd'
    不是字符串,而是
    字符。字符串使用双引号。如果你想学习C,你应该选择一本教科书或教程,这不是方法。或者你可以做
    char*a[1];[0]=“文本”
    @Barmar,
    char*
    不是“字符串”。它是指向“char”的指针。它可能指向字符串中的第一个
    char
    ,但不一定要指向。@HAL9000我知道,但为了翻译的目的,它也有类似的作用。如果你阅读要求澄清的注释,你会发现这不是OP的意思。@CoffeeTableEspresso这不是问题的意思。如果注释被删除,那么任何回复它们的答案都将无效。你是对的,应该有人对问题进行编辑,使其更符合OP的实际要求。字符数组根本不必以NUL结尾。有这样一个字符数组是完全有效的:
    chars[4]=“abcd”“您不能声明大小为零的字符数组,因为所有字符数组(即字符串)都以NULL结尾。”-正确的语句,但动机错误。不能声明大小为零的char(或任何类型)数组,因为C标准是这样规定的。请注意,这在厄尔是不正确的