2016-09-17 17 views
3

私の古いコードと、Cの文字列のmalloc()を初期化する方法を見直しています。malloc中にsize_tをキャストして、C言語のchar *配列を初期化しようとしました

私の現在のスタイルは、charのsize_tを取得し、それを複数の値で取得することです。たとえば、次のように私の古いコードは、私はちょうど私が代わりに私が

char *string = malloc((size_t)PATH_MAX + 1); 

私は以来を使用

char *string = malloc(sizeof(char) * PATH_MAX + 1); 

を使用するなど、欲しかった値にsize_t型の値をキャストしかし

#include <stdlib.h> 
#include <limits.h> 

int main(int argc,char **argv) 
{ 
    char *string = malloc(sizeof(char) * PATH_MAX + 1); 
    /* do stuff */ 
    free(string); 
    return somevalue; 
} 

文字配列の割り当てmallocはデータ型の値をとり、それを適切なバイトサイズとして使用して、前の2つの文を類似させるか、または与えられた仮定でバッファオーバーフローの偶発的な機会を作ります"string"に入れる文字列がPATH_MAXのサイズよりも小さいことを示します。

+2

'malloc(PATH_MAX + 1)'は最も簡単です –

+0

数KBを動的に割り当てるのではなく、 'char string [PATH_MAX + 1];'(@MM - これはもっと簡単です;-))今日のシステムでは、数KBのデータがスタックに簡単に収まります。ヒープの代わりにスタックを使用するマルチスレッドプログラムでは、ヒープの競合を完全に回避するという2つの利点があります。数KBのデータがあなたのスタックにとって大きすぎるプラットフォーム用にプログラミングしているのであれば、すでに知っているはずです。 –

答えて

0

私の現在のスタイルは、size_tのcharを取得し、それを複数の値で取得することです。

標準では、すべての標準準拠のコンパイラでsizeof(char)1と評価されているため、乗算はまったく必要ありません。

古い表現と新しい表現は同じコードに変換する必要があります。

2

sizeof(char)はめったに情報がありません。定義により、常に1であり、タイプはsize_tです。

// Both attempt to allocate the same amount. 
char *string1 = malloc(sizeof(char) * PATH_MAX + 1); 
char *string2 = malloc((size_t)PATH_MAX + 1); 

次は少し異なっています。より簡単ではあるが、PATH_MAXのタイプに応じて、Pedantically PATH_MAX + 1がオーバーフローする可能性があります。

char *string3 = malloc(PATH_MAX + 1); 

ベターPedanticallyこれは、また

char *string5 = malloc(PATH_MAX + (size_t)1); // or like string2 above 

ことsizeof_referenced_variable * element_countイディオムを使用し、タイプの問題を回避する必要があり

char *string4 = malloc(PATH_MAX + 1u); 

です。 sizeof_this * Nを使用

string6 = malloc(sizeof *string6 * (PATH_MAX + 1u)); 

Nが式である場合に利点対N * sizeof_thisを有しています。もちろん

int rows, columns; 
... 
           v------v----- size_t multiplication       
matrix1 = malloc(sizeof *matrix1 * rows * columns); 
         v----------- int multiplication (overflow possible)     
         |   v- size_t multiplication       
matrix2 = malloc(rows * columns * sizeof *matrix2); 

製品はsize_t数学をオーバーフローした場合、コードがSOLです。

0

mallocの引数は、メモリを割り当てるバイト数です。 sizeof(char)はC標準に従って1バイトなので、どちらのメソッドも同じ量のメモリを割り当てます。

関連する問題