对变量使用Malloc

对变量使用Malloc,c,memory-management,malloc,dynamic-memory-allocation,C,Memory Management,Malloc,Dynamic Memory Allocation,所以我的教授花了5分钟在Malloc上,现在我们不得不在一个项目中使用它,但我真的很困惑。我们应该为数组分配内存。我知道Malloc分配内存,然后返回指向第一个字节的指针。如何在变量中使用它?我可以给指针分配一个变量吗?以下是我目前掌握的情况: char *ptr; ptr=((char*) malloc(10*sizeof(char)); 我认为这是准确的,但我不知道从这里走到哪里。如果我声明了我的数组,这不会自动为它创建一个空间吗?我可以把它移到malloc空间吗?我只是不知道这是怎么回事

所以我的教授花了5分钟在Malloc上,现在我们不得不在一个项目中使用它,但我真的很困惑。我们应该为数组分配内存。我知道Malloc分配内存,然后返回指向第一个字节的指针。如何在变量中使用它?我可以给指针分配一个变量吗?以下是我目前掌握的情况:

char *ptr;
ptr=((char*) malloc(10*sizeof(char));

我认为这是准确的,但我不知道从这里走到哪里。如果我声明了我的数组,这不会自动为它创建一个空间吗?我可以把它移到malloc空间吗?我只是不知道这是怎么回事

我假设您具备指针的基本知识,因此这是一个如何使用字符数组(又称C字符串)的示例

str[0]
str[i]
在循环中是访问特定元素的方式。 通过这种方式,您可以获得用户定义的数组大小。 我的意思是用户可以输入一个整数值,我们称之为
n
。 所以你可以说:

char *str = (char*)malloc(sizeof(char)*n);
以下链接可帮助您更好地了解malloc:


让我们从演示程序开始

给你

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
    size_t n = 14;

    char *s = malloc( n );

    if ( s != NULL )
    {
        strcpy( s, "Hello World!" );

        puts( s );
    }

    free( s );

    return 0;
}
所以在这个宣言中,

char *s = malloc( n );
已分配足够的内存来存储字符串literal
“Hello World!”
。但是,系统可能没有足够的内存。在这种情况下,指针的函数malloc返回的值将等于NULL

因此,在使用分配的内存之前,我们要检查内存是否已成功分配

if ( s != NULL )
如果是这样,我们可以将字符串literal
“Hello World!”
复制到分配的内存中

strcpy( s, "Hello World!" );
通常初学者会犯错误。它们只需编写,而不是在分配的内存中处理字符串文字(或其他字符串)

s = "Hello World!";
分配后,分配内存的地址丢失,指针
s
现在指向由字符串文字而不是分配内存占用的内存。结果导致内存泄漏

当我们不需要存储在分配内存中的对象时,必须释放内存

free( s );
这都是第一次

通常,当您为类型为
T
(其中
T
为任意类型)的
N
元素数组分配内存时,您需要编写

T *p = malloc( N * sizeof( T ) );
例如,如果要分配一个包含10个整数的数组,则应写入

int *p = malloc( 10 * sizeof( int ) );
sizeof(char)
始终等于
1
。所以在上面的演示程序中我写了

char *s = malloc( n );
因为它和

char *s = malloc( n * sizeof( char ) );
同样在C中,也不需要像这样强制转换malloc的返回值

T *p = ( T * )malloc( N * sizeof( T ) );
因为函数
malloc
返回类型为
void*
的指针,该指针可以隐式转换为指向任何其他类型对象的指针。您可以使用casting来自我记录代码

< C++ > C中没有这样的隐式转换。所以在C++中你必须使用铸件

T *p = ( T * )malloc( N * sizeof( T ) );

你做过什么调查吗?启动你最喜欢的搜索引擎,输入“C malloc array”。这会给你提供很多信息。显示的代码不正确。需要是
char*ptr。现在,当编译器发出关于缺少函数原型的警告,链接有点过时(我会说是10y+)时,请删除C.@ArkadiuszDrabczyk中不需要/不需要的强制转换。现在它没有害处。它只是一个参数和警告,在一个大型项目中可能会被忽略,被开发人员忽略,编译器可能有bug。@P_uj_u_u它的害处在于它是不必要的,因此它降低了代码可读性,并略微增加了维护负担。@ArkadiuszDrabczyk发现编译器bug的可能性很小,如果编译器给你一个警告,你最好解决它。留下一个“可能”被忽略的警告列表,更严重的警告可能会在混合中丢失。
T *p = ( T * )malloc( N * sizeof( T ) );
T *p = ( T * )malloc( N * sizeof( T ) );