【发布时间】:2021-11-21 09:05:01
【问题描述】:
我试图了解这两个 char 声明之间的内在差异:
char* str1;
char str2[10];
我知道使用char* 会给出一个指向str1 中第一个字符的指针,而char[10] 会产生一个长度为10 个字节的数组(因为char 是一个单字节......我记得在某些编码中它可以更多,但我们只假设一个字节以保持简单)。
我的问题是,当实际为它们赋值时,数据显然必须存储在某个地方,在char[10] 的情况下,我们预先告诉编译器分配十个字节,而在char* 的情况下,我们'真的只是说分配一个指向单个字节的指针。但是如果我们分配给str1 的字符串不止一个字节会发生什么,那是如何分配的呢?还需要多少工作才能适当地分配它?另外,如果我们想将 str1 重新分配为比之前分配的更长的东西会发生什么,它是如何分配的?
由于在处理char pointers 时从编译器的角度来看存在不确定性,当我提前知道长度或想要限制开始长度时,使用char array 是否更有效?
【问题讨论】:
-
如果您的意思是“
char *s = "Hello";中发生了什么分配”,则没有。字符串文字"Hello"嵌入到可执行文件中,您只需让s指向它。一般来说,如果你想看看这些东西是如何工作的,你应该看看生成的程序集。 -
你从哪里得到这个语法
char[10] str2;? -
看看comp.lang.c FAQ的第6节。
-
可以使用 malloc 进行大分配以避免堆栈溢出。可以在堆栈上进行少量分配以获得更好的缓存性能。
-
@hacks,我猜来自 C#?
标签: arrays c pointers dynamic-memory-allocation