为什么要使用malloc?

时间:2013-09-13 20:13:15

标签: c malloc strcpy

我一直试图了解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()执行相同的操作。

3 个答案:

答案 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*不是charstrarray[0]char类型。

使用malloc上分配内存。我建议你阅读Kernighan和Ritchie(C编程语言)了解更多细节吗?

答案 2 :(得分:0)

malloc():分配大小字节的内存块,返回指向块开头的指针。

void* malloc (size_t size);  

size_tunsigned 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本身不为目标字符串分配内存