动态内存分配 - 何时以及为何

时间:2015-11-11 13:23:34

标签: c

我是C的新手并试图理解C中的基本概念,比如何时以及为什么我必须为字符串指针分配内存。 我在这里有一个示例程序。我在适当的位置评论过。请帮我理解。

/ Please help me understand why do I have allocate Memory in Case 2 while I don't have to in Case 1.

#include<stdio.h>
void xcopy(char *t,const char *s);
int  main(int argc, char const *argv[])
{
  char name1[]="Asfakul";
  char *name;
  char *target;
  name=name1; // Here I dont have to allocate Memory (Case 1)
  puts(name);

  target=(char*)calloc(10,sizeof(char));  // Here I have to allocate Memory (Case 2)
  xcopy(target,name);
  return 0;
}


void xcopy(char *t,const char *s)
{
  while( *s !='\0')
  {
    *t=*s;
    t++;
    s++;

  }
  puts(t);

}

2 个答案:

答案 0 :(得分:1)

name=name1; // Here I dont have to allocate Memory (Case 1)

在这种情况下,您 不会将内存分配给 name您只需将其指向数组 name1。简而言之,name现在具有数组name1的第一个元素的地址。

target=(char*)calloc(10,sizeof(char));  // Here I have to allocate Memory (Case 2)
xcopy(target,name);

如果2需要在name1所指向的内存块中复制target的内容时需要分配内存。

在这里,需要好像你没有分配内存然后target指向任何东西(可能是垃圾)并且写入该位置将导致未定义的行为

注意 - 如果指针指向堆栈上的数组,则free不需要1任何内存。但是,当您在堆上分配内存时,需要在free(target);的情况下执行2

答案 1 :(得分:1)

在第一种情况下,您从name1开始,这是char的数组。然后,您namechar *,并为其name1分配name1。由于name正在指针上下文中进行求值,因此它引用了指向数组第一个元素的指针。所以现在name1指向target的第一个元素。

在第二种情况下,calloc被分配了一个由target调用返回的内存位置,在这种情况下是一个10字节的块。现在可以使用malloc现在指向的字节。

与任何指针一样,您需要在取消引用之前为其指定值。该值可以是某个其他变量的地址,也可以是<p>函数族返回的内存块。