検索

malloc関数の使い方

Jun 14, 2019 am 09:55 AM
malloc関数

malloc関数の使い方

malloc の正式名はメモリ割り当てで、中国語では動的メモリ割り当てと呼ばれ、指定されたサイズの連続したメモリ ブロック領域を申請し、その結果を返します。 void* 型でメモリ領域アドレスを割り当てられない場合 メモリの具体的な位置がわかっている場合、実メモリ空間をバインドしたい場合は、動的にメモリを割り当てる必要があります。

void* 型は型なしのポインタを表します。 C、C では、型変換を通じて void* 型を他の型のポインターにキャストできると規定しています。

通常、無料の関数と組み合わせる必要があります。

関数定義

プロトタイプ

extern void *malloc(unsigned int num_bytes);

ヘッダーファイル

#include <stdlib.h>

関数宣言

void *malloc(size_t size);

備考: void*不定の型のポインタを表します。 void * は、任意の型のデータを指すことができます。より具体的に言うと、メモリ空間を申請するときに、ユーザーがこの領域を使用して格納するデータの型が不明であることを意味します (たとえば、 char、int、またはその他のデータ型として)。

戻り値

割り当てが成功した場合は、割り当てられたメモリへのポインタ (この記憶領域の初期値は不定) が返され、それ以外の場合はヌルポインタ NULL が返されます。メモリが使用されなくなった場合は、free() 関数を使用してメモリ ブロックを解放する必要があります。関数によって返されるポインターは、任意のデータ オブジェクトで使用できるように適切に位置合わせされている必要があります。

説明

この関数のプロトタイプに関して、malloc は以前は char ポインタを返していましたが、新しい ASIC 標準では、この関数は void ポインタを返すと規定されているため、必要に応じて型変換が必要です。システムに適用して、num_bytes (または size) バイトの長さのメモリ ブロックを割り当てることができます。

通常、無料の関数と組み合わせる必要があります。 free 関数は、動的に割り当てられたアドレスを解放して、この動的に割り当てられたメモリがもう使用されていないことを示し、以前に動的に適用されたメモリをシステムに返すことができます。

関連関数

calloc、realloc、free、_alloca。

new と

本質的に言えば、malloc (Linux での具体的な実装については、man malloc を参照してください。glibc は brk()&mmap() を通じて実装されます) ) は libc 関数に実装されている場合、stdlib.h がソース コードに直接的または間接的に含まれていない場合、gcc はエラーを報告します: 'malloc' はこのスコープで宣言されていません。ターゲット ファイルが生成された場合 (動的にリンクされた malloc を想定)、実行中のプラットフォームに libc がない場合 (Linux プラットフォームの場合は、空のディレクトリに LD_LIBRARY_PATH を手動で指定するだけです)、または libc に malloc 関数がない場合は、次のようになります。実行時に実行 (ランタイム) 問題が発生しました。 New はそうではなく、c のキーワードであり、関数そのものではありません。 new はヘッダー ファイルに依存しません。C コンパイラは、new をターゲット コードにコンパイルできます (g 4.6.3 は、_Znwm 関数をターゲットに挿入します。さらに、コンパイラは、パラメータの型に応じて、対応するコンストラクタも挿入します) )。

使用法に関しては、malloc と new には少なくとも 2 つの違いがあります。new は指定された型のポインターを返し、必要なサイズを自動的に計算できます。例:

int *p;
p = new int;
//返回类型为int *类型(整数型指针),分配大小为sizeof(int);

または:

int *parr;
parr = new int[100];
//返回类型为int *类型(整数型指针),分配大小为sizeof(int) * 100;

ただし、malloc を使用する場合は、バイト数を計算し、返された後に実際の型のポインターに強制的に変換する必要があります。

int *p;
p = (int*)malloc(sizeof(int) * 128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd = (double*)malloc(sizeof(double) * 12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中

まず、malloc 関数は void * 型を返します。

C の場合、次のように記述すると: p = malloc (sizeof(int)); プログラムはコンパイルできず、「void* を int * 型変数に割り当てることはできません」というエラー メッセージが報告されます。 。

したがって、キャストするには (int *) を渡す必要があります。 C の場合、そのような要件はありませんが、C プログラムを C に移植しやすくするために、強制変換の習慣を身に付けることをお勧めします。

2 番目に、関数の実際のパラメータは sizeof(int) で、これは整数データの必要なサイズを指定するために使用されます。

malloc(0) の特殊なケースに注意する必要があり、戻り値は NULL または有効なアドレスである可能性があります (安全に解放できますが、逆参照はできません)。 malloc(-1) は禁止されていないことに注意してください。パラメータは符号なし型です。負の数の場合、非常に大きな正の数に変換される可能性があります。大きな値がないため、最終的には通常 NULL が返されます。十分なメモリブロック。

標準プログラムでは、次の形式で malloc と free を使用する必要があります:

type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))
/*请使用if来判断,这是有必要的*/
{
    perror("error...");
    exit(1);
}
.../*其它代码*/
free(p);
p = NULL;/*请加上这句*/

malloc は new [] の効果を実現し、連続メモリに適用することもできます。以上 必要なメモリサイズを指定します。

たとえば、100 個の int 型スペースを割り当てたい場合:

int *p = (int*)malloc(sizeof(int) * 100);
//分配可以放得下100个整数的内存空间。

直接確認できないもう 1 つの違いは、malloc はメモリを割り当てるだけで、結果のメモリを初期化できないことです。新しいメモリの場合、その値はランダムになります。

割り当て方法と最終解放方法が異なることを除いて、ポインタは malloc または new を通じて取得され、その他の操作は一貫しています。

それを補足するために特別なケースを作成します

char *ptr;
if((ptr = (char*)malloc(0)) == NULL)
    puts("Gotanullpointer");
else
    puts("Gotavalidpointer");

この時点で、「有効なポインターを取得しました」というメッセージが表示される場合もあれば、「ヌル ポインターを取得しました」というメッセージが表示される場合もあります。

作業メカニズム

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

程序示例

正常程序

typedef struct data_type{
    int age;
    char name[20];
}data;
data*bob=NULL;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL)
{
    bob->age=22;
    strcpy(bob->name,"Robert"); 
    printf("%s is %d years old.\n",bob->name,bob->age);
}
else
{
    printf("mallocerror!\n");
    exit(-1);
}  
free(bob);
bob=NULL;

输出结果:Robert is 22 years old.

内存泄漏实例

#include <stdio.h>
#include <malloc.h>
#define MAX 100000000int main(void)
{
    int *a[MAX] = {NULL};
    int i;
    for(i=0;i<MAX;i++)
    {
    a[i]=(int*)malloc(MAX);
    }
    return 0;
}

注:malloc申请之后没有检测返回值。

推荐教程:C#视频教程

以上がmalloc関数の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C#と.NET:2つの関係を理解し​​ますC#と.NET:2つの関係を理解し​​ますApr 17, 2025 am 12:07 AM

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プ​​ラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。

c#.netの継続的な関連性:現在の使用法を見るc#.netの継続的な関連性:現在の使用法を見るApr 16, 2025 am 12:07 AM

C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

Webからデスクトップまで:C#.NETの汎用性Webからデスクトップまで:C#.NETの汎用性Apr 15, 2025 am 12:07 AM

c#.netisversatileforbothwebanddesktopdevelopment.1)forweb、useasp.netfordynamicapplications.2)fordesktop、equindowsorwpfforrichinterfaces.3)usexamarinforcross-platformdeveliment、enabling deshacrosswindows、

c#.net and the Future:新しいテクノロジーへの適応c#.net and the Future:新しいテクノロジーへの適応Apr 14, 2025 am 12:06 AM

C#と.NETは、継続的な更新と最適化を通じて、新しいテクノロジーのニーズに適応します。 1)C#9.0および.NET5は、レコードタイプとパフォーマンスの最適化を導入します。 2).Netcoreは、クラウドネイティブおよびコンテナ化されたサポートを強化します。 3)ASP.Netcoreは、最新のWebテクノロジーと統合されています。 4)ML.NETは、機械学習と人工知能をサポートしています。 5)非同期プログラミングとベストプラクティスはパフォーマンスを改善します。

c#.netはあなたにぴったりですか?その適用性の評価c#.netはあなたにぴったりですか?その適用性の評価Apr 13, 2025 am 12:03 AM

c#.netissuitableforenterprise-levelApplicationsとsystemduetoitsSystemdutyping、richlibraries、androbustperformance.

.NET内のC#コード:プログラミングプロセスの調査.NET内のC#コード:プログラミングプロセスの調査Apr 12, 2025 am 12:02 AM

.NETでのC#のプログラミングプロセスには、次の手順が含まれます。1)C#コードの作成、2)中間言語(IL)にコンパイルし、3).NETランタイム(CLR)によって実行される。 .NETのC#の利点は、デスクトップアプリケーションからWebサービスまでのさまざまな開発シナリオに適した、最新の構文、強力なタイプシステム、および.NETフレームワークとの緊密な統合です。

C#.NET:コアの概念とプログラミングの基礎を探るC#.NET:コアの概念とプログラミングの基礎を探るApr 10, 2025 am 09:32 AM

C#は、Microsoftによって開発された最新のオブジェクト指向プログラミング言語であり、.NETフレームワークの一部として開発されています。 1.C#は、カプセル化、継承、多型を含むオブジェクト指向プログラミング(OOP)をサポートしています。 2。C#の非同期プログラミングは非同期を通じて実装され、適用応答性を向上させるためにキーワードを待ちます。 3. LINQを使用してデータ収集を簡潔に処理します。 4.一般的なエラーには、null参照の例外と、範囲外の例外インデックスが含まれます。デバッグスキルには、デバッガーと例外処理の使用が含まれます。 5.パフォーマンスの最適化には、StringBuilderの使用と、不必要な梱包とボクシングの回避が含まれます。

テストC#.NETアプリケーション:ユニット、統合、およびエンドツーエンドテストテストC#.NETアプリケーション:ユニット、統合、およびエンドツーエンドテストApr 09, 2025 am 12:04 AM

C#.NETアプリケーションのテスト戦略には、ユニットテスト、統合テスト、エンドツーエンドテストが含まれます。 1.単位テストにより、コードの最小ユニットがMSTEST、ヌニット、またはXUNITフレームワークを使用して独立して動作することを保証します。 2。統合テストでは、一般的に使用されるシミュレートされたデータと外部サービスを組み合わせた複数のユニットの機能を検証します。 3.エンドツーエンドのテストでは、ユーザーの完全な操作プロセスをシミュレートし、通常、セレンは自動テストに使用されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター