字符串指针与数组

时间:2012-12-12 09:23:04

标签: c arrays string pointers char

我想知道在定义为

的字符串之间是否存在任何差异(在语法和性能方面)
char str[200];

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

使用方面是否存在差异? (例如,一个与strncpy或其他内容不兼容)更重要的是,在性能方面存在差异吗?

编辑:我知道由char *calloc定义的数组可以增长和缩小,但是我应该在堆栈内存中选择堆内存还是反过来任何原因?这就是我真正想要问的问题。

7 个答案:

答案 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/

What and where are the stack and heap?

答案 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)

你应该尽可能使用堆栈分配:它对于程序员来说更容易维护,而且在性能方面也要求不高。

在许多情况下,阵列堆栈分配是不可能的。

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

另请注意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];

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