我一直试图了解malloc()是什么以及为什么使用它。我知道malloc是用于动态分配内存的,如果你不知道你要创建多少内存就需要它。我一直在做一些动手。
以下代码声明了一个字符指针数组,第一个字符指针初始化为“hello”。这很好。
int main()
{
char *strarray[5];
strarray[0]="hello";
printf("%s\n",strarray[0]);
return 0;
}
但是,如果我尝试使用strcpy()函数将“hello”字符串复制到strarray [0](没有malloc()),则会出现问题。它进入一些循环并且不复制字符串。如果我使用malloc来分配内存,它工作正常。
int main()
{
char *strarray[5];
//strarray[0]=(char *)malloc(sizeof(char)*10);
strcpy(strarray[0],"hello");
printf("%s\n",strarray[0]);
return 0;
}
我想知道是什么产生了影响?如果我可以将“hello”初始化为未使用malloc的char指针,为什么我不能对strcpy()执行相同的操作。
答案 0 :(得分:2)
char *strarray[5];
将为字符分配五个指针的数组(可以解释为字符串)。
将不会分配是将这五个字符串放置到的内存空间。所以,如果你想让所有指针指向不同的字符串,你需要自己分配它们。
然而,由于这些是指针,如果你不想,你根本不需要分配任何东西。这就是你的第一个例子正在运作的原因。 strarray[0]="hello";
将使数组的第一个元素指向存储"hello"
字符串文字的位置(编译器会将此字面值放在内存中,因此指针将指向有效记忆位置)。
总而言之,在第一个例子中,你的指针指向已经分配并用"hello"
初始化的内存(编译器为你做了这个) - 你没有复制字符串,你只是在分配指针的值。在第二个示例中,指针指向某个未定义的位置,您没有明确保留该位置,但是您正在尝试写入它。
答案 1 :(得分:2)
这是错误的:char *strarray[5];
这是堆栈分配5个char *指针。我想你想写char strarray[6]
,它在堆栈上创建了6个字符。这可以容纳“hello”及其隐式NULL终止符(NULL终止符告诉C函数字符串已经结束)。
写完char strarray[6];
后,strcpy(strarray, "hello");
是安全的。然后你可以打电话:
printf("%s\n",strarray);
我放弃了[0]:%s
期望char*
不是char
:strarray[0]
是char
类型。
使用malloc
在堆上分配内存。我建议你阅读Kernighan和Ritchie(C编程语言)了解更多细节吗?
答案 2 :(得分:0)
malloc()
:分配大小字节的内存块,返回指向块开头的指针。
void* malloc (size_t size);
size_t
是unsigned int
类型。
在malloc()的帮助下,您可以在run time
而非compile time.
分配内存
strarray[0]="hello";
//here you need not to allocate memory as this is an assignment
在destination string
strcpy()
之前,您需要分配一些空格
strcpy()
将source指向的C字符串复制到destination指向的数组中,包括终止空字符(并在该点停止)。
目标指向的数组的大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且不应在内存中与源重叠。
为此你需要allocate Memory first
。
strcpy
本身不为目标字符串分配内存