2015-11-11 1 views
0

Я новичок в 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); 

} 

ответ

1

В первом случае вы начинаете с name1, который представляет собой массив char. Затем вы берете name, который является char *, и назначьте ему name1. Поскольку name1 оценивается в контексте указателя, он ссылается на указатель на первый элемент массива. Итак, теперь name указывает на первый элемент name1.

Во втором случае target присваивается ячейка памяти, возвращаемая вызовом calloc, который в этом случае представляет собой блок из 10 байтов. Теперь можно использовать байты, на которые теперь указывает target.

Как и любой указатель, вам необходимо присвоить ему значение, прежде чем вы сможете разыменовать его. Это значение может быть либо адресом некоторой другой переменной, либо блоком памяти, возвращаемым семейством функций malloc.

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, поскольку вы выделяете память на кучу.

Смежные вопросы