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

时间:2019-06-28 20:00:41

标签: c

我是一名熟练的Java程序员。但是我很难掌握C的一些概念。

我在网上遇到了一些C代码,该代码在长度为1的char数组中存储了一个字符串。

char a[0] = 'abcd';

在Java中。根本不可能。但是有人可以告诉我在C语言中是否可行?

如果是,请简要说明。

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

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

现在,我需要在C中使用数组大小​​1来执行此操作。

4 个答案:

答案 0 :(得分:2)

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

char a[1] = "";

终止的空字符是唯一可以存储的东西。

如果要使用C语言编写字符串数组,请执行以下操作:

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

答案 1 :(得分:0)

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

要在C中实现String[] a = new String[1]; a[0] = "string";的C等效项,您可以执行以下操作:

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

答案 2 :(得分:0)

几件事:

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

因此,总而言之,除了空字符串(即0终止符)外,您不能在1个元素宽的字符数组中存储任何内容。

根据您的评论:

  

在Java中,如果我需要存储字符串数组,我会这样做。 String[] a = new String[1]; a[0] = "text";现在,我需要在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],然后将字符串常量"text"复制到该新缓冲区中。由于C不会自动进行垃圾回收,因此您需要在使用完该内存后手动释放该内存:

free( a[0] );

答案 3 :(得分:-1)

嗯,不。这不可能。 实际上,您发布的代码有很多错误之处。

首先,您不能声明大小为零的char数组,因为所有char数组(即字符串)都以NULL结尾,这意味着它们以整个零字节结尾,因此即使您想要有一个空字符串

char empty[1] = "";

此外,在C语言中,charstring之间存在具体差异。字符写为'a',字符串写成"this is a string",而在其他编程语言(如Python)中则没有这种区别。

您可以做什么,但要小心,因为这仅在声明变量时有效,继续您的示例的步骤如下:

char s[] = "abcd";

如果您想更深入一点,也许您应该寻找有关malloc()函数的信息。