2

我想知道定义的字符串之间是否有任何区别(在语法和性能方面)

char str[200];

char *str;
str = calloc(200, sizeof(char));

用法上有区别吗?(例如,一个不兼容strncpy什么的)更重要的是,在性能方面是否存在差异?

编辑:我知道由char *and定义的数组calloc可以增长和缩小,但是我应该选择堆内存而不是堆栈内存还是出于任何原因?这才是我真正想问的。

4

7 回答 7

4

char str[200]在堆栈内存中calloc()分配,而在堆内存中分配。

根据 calloc() 的性质,它将 0 分配给它分配的所有字节。

请参考以下堆栈和堆比较

哪个更快:堆栈分配或堆分配

http://www.linuxquestions.org/questions/programming-9/stack-faster-than-heap-685004/

堆栈和堆是什么以及在哪里?

于 2012-12-12T09:25:10.850 回答
3

用法上有区别吗?(例如,一个与 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)
于 2012-12-12T09:43:04.927 回答
1

首先,在堆栈上分配内存,而其次分配动态内存。堆栈内存是自动管理的,而动态内存需要手动管理。

当您有选择时,您应该始终首选第一个:

  • 你不必记得释放任何东西
  • 动态内存在性能方面几乎没有开销。

用法上有区别吗?(例如,一个与 strncpy 或其他东西不兼容)

就函数的使用而言,两者都是相似的,从简单的意义上讲,当使用函数时,两者都是指向连续内存块的指针。当您将数组传递给函数时,它会衰减为指向第一个元素的指针。
区别在于它们的存储位置以及它们是自动管理还是手动管理。

于 2012-12-12T09:25:37.580 回答
1

char str[200];

  • 是一个简单的声明(不是动态分配),
  • 默认值是垃圾,
  • 快速访问(在堆栈段中),
  • Scope is local(之内 {})。

字符 *str;
str = calloc(200, sizeof(char));

  • 所有元素的值都为零(因为calloc()),
  • 访问速度慢(堆段使用),
  • 动态分配使用即高效使用内存。
  • 需要明确取消分配,
  • 内存Scope is global,您可以 return str从例如函数中返回。
于 2012-12-12T09:26:51.443 回答
0

您应该尽可能使用堆栈分配:它对程序员来说更容易维护,而且对性能的要求也较低。

在很多情况下,数组堆栈分配是不可能的。

  • 如果您在编译时不知道数组的大小。然而最近的 C 标准对此有一些支持,
  • 你有一个大小不相同的数组数组,
  • 您需要在函数返回后保留分配的内存。

另请注意,char str[200]“知道”它的大小(即sizeof(str) == 200*sizeof(char)),而您必须在辅助变量中记住分配数组的大小才能使用它(sizeof(str) == sizeof(char*)通常为 4 或 8)。

于 2012-12-12T09:39:52.910 回答
-1

Char 数组内存分配在堆栈上。一旦控制移出包含数组的函数,内存就会被释放并且现在无法访问数组。

虽然 calloc 函数在堆上分配内存并保持到程序正在执行或内存被手动释放

于 2012-12-12T09:27:26.397 回答
-1

创建字符串后,用法没有区别。

char str[100] 在堆栈上分配字符串,而另一种方法使用堆。堆栈上的分配总是比堆上快(请参阅此讨论:哪个更快:堆栈分配或堆分配

此外,calloc() 将数组的所有元素设置为 0/NULL,进一步降低了性能。如果您使用 C++ 编程并需要使用堆,请始终编写:

字符 *str = 新字符 [200];

这有额外的好处,例如,如果堆已满,则会引发错误。

于 2012-12-12T09:30:48.413 回答