我一直在试图理解什么是malloc()以及为什么使用它。我知道malloc用于动态分配内存,如果您不知道不想创建多少内存,则需要它。我一直在做一些动手操作。
下面的代码声明一个字符指针数组,第一个字符指针用"hello"初始化。这工作正常。
int main()
{
char *strarray[5];
strarray[0]="hello";
printf("%sn",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("%sn",strarray[0]);
return 0;
}
我想知道是什么造成了差异?如果我可以将"hello"初始化为不使用 malloc 的字符指针,为什么我不能对 strcpy() 做同样的事情。
char *strarray[5];
将为字符分配五个指针的数组(可以解释为字符串)。
这不会分配的是放置这五个字符串的内存空间。因此,如果要使所有指针都指向不同的字符串,则需要自己分配它们。
但是,由于这些是指针,如果您不想分配任何东西,则实际上不需要分配任何东西。这就是为什么你的第一个例子是有效的。 strarray[0]="hello";
将使数组的第一个元素指向存储字符串文本的位置"hello"
(编译器会将此文本放在内存中的某个位置,因此指针将指向有效的内存位置)。
总而言之,在第一个例子中,你的指针指向已经分配并用"hello"
初始化的内存(编译器为你做了这个) - 你不是在复制字符串,你只是在为指针赋值。在第二个示例中,您的指针指向某个未定义的位置,您没有明确保留该位置,但您正在尝试写入该位置。
这是错误的: char *strarray[5];
这是堆栈分配 5 个字符* 指针。我想你想写char strarray[6]
,它在堆栈上创建 6 个字符。这可以容纳"hello"及其隐式 NULL 终止符(NULL 终止符告诉 C 函数字符串已结束)。
写了char strarray[6];
,strcpy(strarray, "hello");
是安全的。然后你可以打电话:
printf("%sn",strarray);
我删除了 [0]:%s
期望char*
而不是char
:strarray[0]
是一种char
类型。
您可以使用 malloc
在堆上分配内存。我可以建议你阅读Kernighan和Ritchie(C编程语言)以获取更多详细信息吗?
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()
将源指向的 C 字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。
目标指向的数组的大小应足够长,以包含与源相同的 C 字符串(包括终止空字符),并且不应在内存中与源重叠。
为此,您需要allocate Memory first
.
strcpy
本身不会为目标字符串分配内存