我是一名熟练的Java程序员。但是我很难掌握C的一些概念。
我在网上遇到了一些C代码,该代码在长度为1的char数组中存储了一个字符串。
char a[0] = 'abcd';
在Java中。根本不可能。但是有人可以告诉我在C语言中是否可行?
如果是,请简要说明。
在Java中,如果我需要存储字符串数组,我会这样做
String[] a = new String[1]; a[0] = "text";
现在,我需要在C中使用数组大小1来执行此操作。
答案 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)
几件事:
'abcd'
不是 string -它是一个多字节字符常量,并且其行为完全是 特定于实现的。请注意,在C语言中,像'A'
和'\n'
这样的字符常量的类型为int
,而不是char
。
char a[0]
无效-如果将常量表达式用于数组大小(如此处所示),则必须大于0。这是违反约束并且需要 发出诊断信息(尽管它不必暂停翻译)。
char
或wchar_t
,并且该数组必须足够大以容纳0终止符-IOW,N字符字符串需要一个数组至少要 个N + 1个字符存储在其中。
"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语言中,char
和string
之间存在具体差异。字符写为'a'
,字符串写成"this is a string"
,而在其他编程语言(如Python)中则没有这种区别。
您可以做什么,但要小心,因为这仅在声明变量时有效,继续您的示例的步骤如下:
char s[] = "abcd";
如果您想更深入一点,也许您应该寻找有关malloc()
函数的信息。