c - 为什么使用 malloc?

标签 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() 做同样的事情。

最佳答案

char *strarray[5];

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

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

但是,由于这些是指针,如果您不想的话,您实际上不需要分配任何东西。这就是您的第一个示例起作用的原因。 strarray[0]="hello"; 将使数组的第一个元素指向存储 "hello" 字符串文字的位置(编译器会将此为您在内存中的某个地方提供文字,因此您的指针将指向有效的内存位置)。

总而言之,在第一个示例中,您的指针指向已分配并使用 "hello" 初始化的内存(编译器为您完成了此操作)- 您没有复制字符串,您只是在为指针赋值。在第二个示例中,您的指针指向某个未定义的位置,您没有明确保留该位置,但您正试图写入它。

关于c - 为什么使用 malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794487/

相关文章:

调用具有不同参数个数的 cdecl 函数

c - 如何从 bash 向 C 程序提供输入?

c - 为什么这个程序不创建核心转储?

c - Valgrind: "Conditional jump or move depends on uninitialised value(s)"

c - 不允许函数定义/

java - 如何更新优先级队列中的位置

linux - 在 Linux 中分配特定地址

c - 矩阵大小未正确评估

c - C有字符串类型吗?

c++ - strcpy() 导致从 ‘const char*’ 到 ‘char*’ 的无效转换 [-fpermissive]