繁体   English   中英

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

[英]Dynamic Memory Allocation - When and Why

我是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);

}
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情况下,您需要在target指向的存储块中复制name1的内容时分配内存。

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

注意 –在情况1由于指针指向堆栈中的数组,因此您不需要free任何内存。 但是你需要做free(target); 在情况2当您在堆上分配内存时。

在第一种情况下,您从name1开始,它是char的数组。 然后,您获取name ,它是一个char * ,并为其分配name1 由于name1是在指针上下文中求值的,因此它是指向数组第一个元素的指针。 因此,现在name指向name1的第一个元素。

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

与任何指针一样,您需要先给它分配一个值,然后才能取消引用它。 该值可以是某些其他变量的地址,也可以是malloc系列函数返回的内存块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM