为什么使用malloc?
我一直在试图理解什么是malloc(),为什么要使用它。我知道malloc是用于动态分配内存的,如果您不知道不需要创建多少内存,就需要它。我一直在做一些实际操作 下面的代码声明了一个字符指针数组,第一个字符指针初始化为“hello”。这个很好用为什么使用malloc?,c,malloc,strcpy,C,Malloc,Strcpy,我一直在试图理解什么是malloc(),为什么要使用它。我知道malloc是用于动态分配内存的,如果您不知道不需要创建多少内存,就需要它。我一直在做一些实际操作 下面的代码声明了一个字符指针数组,第一个字符指针初始化为“hello”。这个很好用 int main() { char *strarray[5]; strarray[0]="hello"; printf("%s\n",strarray[0]); return 0; } 但如果我尝试使用strcpy()函数将“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()执行同样的操作呢
将为字符(可以解释为字符串)分配五个指针的数组
此不会分配的是用于放置这五个字符串的内存空间。因此,如果您想让所有指针指向不同的字符串,您需要自己分配它们
然而,由于这些都是指针,如果您不想分配,那么您实际上不需要分配任何东西。这就是为什么您的第一个示例有效<代码>strarray[0]=“你好”将使数组的第一个元素指向存储“hello”
字符串文字的位置(编译器将为您将此文字放在内存中的某个位置,因此您的指针将指向有效的内存位置)
总之,在第一个示例中,指针指向已分配并初始化为“hello”
(编译器为您完成了此操作)的内存-您不是在复制字符串,而是在为指针赋值。在第二个示例中,指针指向某个未定义的位置,您没有显式保留该位置,但正在尝试写入该位置
将为字符(可以解释为字符串)分配五个指针的数组
此不会分配的是用于放置这五个字符串的内存空间。因此,如果您想让所有指针指向不同的字符串,您需要自己分配它们
然而,由于这些都是指针,如果您不想分配,那么您实际上不需要分配任何东西。这就是为什么您的第一个示例有效<代码>strarray[0]=“你好”将使数组的第一个元素指向存储“hello”
字符串文字的位置(编译器将为您将此文字放在内存中的某个位置,因此您的指针将指向有效的内存位置)
总之,在第一个示例中,指针指向已分配并初始化为
“hello”
(编译器为您完成了此操作)的内存-您不是在复制字符串,而是在为指针赋值。在第二个示例中,指针指向某个未定义的位置,您没有显式保留该位置,但正在尝试写入该位置 这是错误的:char*strarray[5]代码>这是分配5个字符*指针的堆栈。我认为您想要编写字符strarray[6]
,它在堆栈上创建6个字符。可以容纳“hello”及其隐式空终止符(空终止符告诉C函数字符串已结束)
编写了字符集[6]代码>,strcpy(strarray,“你好”)代码>是安全的。然后你可以打电话:
printf("%s\n",strarray);
在我删除[0]的地方:%s
需要的是char*
而不是char
:strarray[0]
是char
类型
您可以使用malloc
在堆上分配内存。我建议您阅读Kernighan和Ritchie(C编程语言)了解更多关于这方面的详细信息吗?这是错误的:char*strarray[5]代码>这是分配5个字符*指针的堆栈。我认为您想要编写字符strarray[6]
,它在堆栈上创建6个字符。可以容纳“hello”及其隐式空终止符(空终止符告诉C函数字符串已结束)
编写了字符集[6]代码>,strcpy(strarray,“你好”)代码>是安全的。然后你可以打电话:
printf("%s\n",strarray);
在我删除[0]的地方:%s
需要的是char*
而不是char
:strarray[0]
是char
类型
您可以使用malloc
在堆上分配内存。我建议您阅读Kernighan和Ritchie(C编程语言)了解更多详细信息。malloc()
:分配一个大小为字节的内存块,返回指向该块开头的指针
void* malloc (size_t size);
size\u t
是一种unsigned int
类型
如果您不知道不需要创建多少内存,则需要使用它,这是不正确的。
您应该知道需要多少最小内存
在malloc()的帮助下,您可以在运行时而不是编译时分配内存。
strarray[0]="hello";
//here you need not to allocate memory as this is an assignment
在strcpy()
strcpy()
将源指向的C字符串复制到目标指向的数组中,包括终止的空字符(并在该点停止)
目标指向的数组的大小应足够长,以包含与源相同的C字符串(包括终止的空字符),并且在内存中不应与源重叠
为此,您需要先分配内存
strcpy
本身不为目标字符串分配内存malloc()
:分配一个大小为字节的内存块,返回指向该块开头的指针
void* malloc (size_t size);
size\u t
是一种unsigned int
类型
如果你不知道你不想创造多少内存,那么它是需要的