C语言 为什么使用malloc



我一直在试图理解什么是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*而不是charstrarray[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本身不会为目标字符串分配内存

相关内容

  • 没有找到相关文章

最新更新