Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用malloc?_C_Malloc_Strcpy - Fatal编程技术网

为什么使用malloc?

为什么使用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”字符串复制

我一直在试图理解什么是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()执行同样的操作呢

将为字符(可以解释为字符串)分配五个指针的数组

不会分配的是用于放置这五个字符串的内存空间。因此,如果您想让所有指针指向不同的字符串,您需要自己分配它们

然而,由于这些都是指针,如果您不想分配,那么您实际上不需要分配任何东西。这就是为什么您的第一个示例有效<代码>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
类型

如果你不知道你不想创造多少内存,那么它是需要的