我想知道在定义为
的字符串之间是否存在任何差异(在语法和性能方面)char str[200];
和
char *str;
str = calloc(200, sizeof(char));
使用方面是否存在差异? (例如,一个与strncpy
或其他内容不兼容)更重要的是,在性能方面存在差异吗?
编辑:我知道由char *
和calloc
定义的数组可以增长和缩小,但是我应该在堆栈内存中选择堆内存还是反过来任何原因?这就是我真正想要问的问题。
答案 0 :(得分:4)
char str[200]
在堆栈内存中分配,其中calloc()
在堆内存中分配。
根据calloc()的性质,它将0分配给它分配的所有字节。
请参阅以下内容进行堆栈和堆比较
Which is faster: Stack allocation or Heap allocation
http://www.linuxquestions.org/questions/programming-9/stack-faster-than-heap-685004/
答案 1 :(得分:3)
使用方面是否存在差异? (例如,一个不是 与strncpy或其他东西兼容)
我很惊讶没有人提到第一个str,即数组名称评估为常量指针而无法重新分配,其中第二个是指针变量,可以重新分配。
所以
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)
答案 2 :(得分:1)
首先,在堆栈上分配内存,然后第二次分配动态内存。堆栈内存是自动管理的,而动态内存需要手动管理。
当你有选择时,你应该总是喜欢第一个:
使用方面是否存在差异? (例如,一个与strncpy或其他东西不兼容)
就功能的使用而言,两者都是相似的,在简单意义上,当使用函数时,两者都是指向连续内存块的指针。当您将数组传递给函数时,它会衰减为指向第一个元素的指针 区别在于它们的存储位置以及它们是自动管理还是手动管理。
答案 3 :(得分:1)
char str[200];
Scope is local
(在{}中)。 char * str;
str = calloc(200,sizeof(char));
calloc()
),Scope is global
,您可以返回,例如来自函数`的return str
。 答案 4 :(得分:0)
你应该尽可能使用堆栈分配:它对于程序员来说更容易维护,而且在性能方面也要求不高。
在许多情况下,阵列堆栈分配是不可能的。
另请注意char str[200]
“知道”其大小(即sizeof(str) == 200*sizeof(char)
),而您必须记住辅助变量中已分配数组的大小才能使用它({{1} },通常是4或8)。
答案 5 :(得分:-1)
Char数组内存在堆栈上分配。一旦控件移出包含数组的函数,内存就会被释放,现在无法访问数组。
虽然calloc函数在堆上分配内存并一直保持到程序执行或手动释放内存
答案 6 :(得分:-1)
创建字符串后,使用情况没有差异。
char str [100]在堆栈上分配字符串,而另一种方法使用堆。堆栈上的分配总是比堆上快(请参阅此讨论:Which is faster: Stack allocation or Heap allocation)
此外,calloc()将数组的所有元素设置为0 / NULL,从而进一步降低性能。如果您使用C ++编程并且需要使用堆,请始终写:
char * str = new char [200];
这具有额外的好处,例如如果堆已满,则引发错误。