我想知道定义的字符串之间是否有任何区别(在语法和性能方面)
char str[200];
和
char *str;
str = calloc(200, sizeof(char));
用法上有区别吗?(例如,一个不兼容strncpy
什么的)更重要的是,在性能方面是否存在差异?
编辑:我知道由char *
and定义的数组calloc
可以增长和缩小,但是我应该选择堆内存而不是堆栈内存还是出于任何原因?这才是我真正想问的。
char str[200]
在堆栈内存中calloc()
分配,而在堆内存中分配。
根据 calloc() 的性质,它将 0 分配给它分配的所有字节。
请参考以下堆栈和堆比较
http://www.linuxquestions.org/questions/programming-9/stack-faster-than-heap-685004/
用法上有区别吗?(例如,一个与 strncpy 或其他东西不兼容)
I am surprised that no one mentioned that first str i.e. array name evaluates to a constant pointer and cannot be reassigned, where as the second one is a pointer variable which can be reassigned.
So
char str[SIZE];
char * b = malloc(SIZE);
str = b; // This is a compilation error
b = str; // where as this is perfectly legal (ignoring the fact
// that we are losing malloced memory without actually freeing it)
首先,在堆栈上分配内存,而其次分配动态内存。堆栈内存是自动管理的,而动态内存需要手动管理。
当您有选择时,您应该始终首选第一个:
用法上有区别吗?(例如,一个与 strncpy 或其他东西不兼容)
就函数的使用而言,两者都是相似的,从简单的意义上讲,当使用函数时,两者都是指向连续内存块的指针。当您将数组传递给函数时,它会衰减为指向第一个元素的指针。
区别在于它们的存储位置以及它们是自动管理还是手动管理。
char str[200];
Scope is local
(之内 {})。字符 *str;
str = calloc(200, sizeof(char));
calloc()
),Scope is global
,您可以 return str
从例如函数中返回。 您应该尽可能使用堆栈分配:它对程序员来说更容易维护,而且对性能的要求也较低。
在很多情况下,数组堆栈分配是不可能的。
另请注意,char str[200]
“知道”它的大小(即sizeof(str) == 200*sizeof(char)
),而您必须在辅助变量中记住分配数组的大小才能使用它(sizeof(str) == sizeof(char*)
通常为 4 或 8)。
Char 数组内存分配在堆栈上。一旦控制移出包含数组的函数,内存就会被释放并且现在无法访问数组。
虽然 calloc 函数在堆上分配内存并保持到程序正在执行或内存被手动释放
创建字符串后,用法没有区别。
char str[100] 在堆栈上分配字符串,而另一种方法使用堆。堆栈上的分配总是比堆上快(请参阅此讨论:哪个更快:堆栈分配或堆分配)
此外,calloc() 将数组的所有元素设置为 0/NULL,进一步降低了性能。如果您使用 C++ 编程并需要使用堆,请始终编写:
字符 *str = 新字符 [200];
这有额外的好处,例如,如果堆已满,则会引发错误。