我是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);
}
答案 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
的数组。然后,您name
,char *
,并为其name1
分配name1
。由于name
正在指针上下文中进行求值,因此它引用了指向数组第一个元素的指针。所以现在name1
指向target
的第一个元素。
在第二种情况下,calloc
被分配了一个由target
调用返回的内存位置,在这种情况下是一个10字节的块。现在可以使用malloc
现在指向的字节。
与任何指针一样,您需要在取消引用之前为其指定值。该值可以是某个其他变量的地址,也可以是<p>
函数族返回的内存块。