2013-09-28 15 views
18

テキストファイルから一連の文字列を読み込み、文字列の配列に格納し、各要素に動的にメモリを割り当てるプログラムを作成しようとしています。私の計画は、ポインタを使って各文字列を配列に格納し、次に読み込まれた配列のサイズを大きくすることでした。なぜ私の下のテストコードが機能していないのか分かりません。これは実行可能なアイデアですか?ポインタ配列の動的メモリ割り当て

char *aPtr; 
aPtr =(char*)malloc(sizeof(char)); 

aPtr[0]="This is a test"; 


printf("%s",aPtr[0]); 
+1

これは、1文字のための 'malloc'スペースがあり、文字列全体を' char'型の左辺値に代入しようとしたために機能しません。 –

+0

お勧めの読書:[Cでmallocを使用する必要がありますか?](http://stackoverflow.com/a/1963812/2455888) – haccks

答えて

15

文字列は、char*です。 Tの動的配列は、Tへのポインタとして表されます。したがって、char*の場合はchar**となります。単純にchar*の宣言方法ではありません。

コンパイラは間違いなく、それに関する警告を出しました。これらの警告に注意を払い、何をすべきかを理解するのに役立つことがよくあります。ここで

は、あなたのテストを開始することができる方法です。

char **aPtr; 
int len = 1; // Start with 1 string 
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C 
aPtr[0] = "This is a test"; 
printf("%s",aPtr[0]); // This should work now. 
+0

あなたがcharへのポインタの動的な配列を必要とするかどうかを確認するには(私と一緒にいてください、私は初心者です=)、(例えば、可変数の文字列を格納する必要があるかもしれないアプリケーション長さを知らずにテキストファイルを読んだり、不特定の長さのユーザー入力を集めたりしていた場合、Char *の動的配列が必要になり、Char **が必要になります。 char **は、異なる文字列の開始アドレスであってもよい異なる文字ポインタを指すことがあります。 –

+0

ここで 'len = 1'は何ですか? 'This is a test 'は14文字で、それぞれ1バイトですが、このコードには14は言及せず、実行時にsegfaultもしません。 – nmz787

+0

@ nmz787 'aPtr'の型に注意してください。これはダブルポインタです。したがって、charポインタの配列を表します。次に、charポインタが要素0に設定されます。このコードでは文字列のコピーは行われません。 – dasblinkenlight

5
char * aPtr; 

は、あなたが正確に1文字を保持するためのメモリを割り当てられた文字へのポインタとしてです。

あなたはこの文字のメモリをアドレス指定し、それにリテラル"test"のアドレスを格納しよう

aPrt[0] = "test"; 

を行います。このアドレスはほとんどのlikleyが文字よりも広いので、これは失敗します。

コードへの修正は、文字へのポインタ用にメモリを割り当てることです。

char ** aPtr = malloc(sizeof(char *)); 
aPtr[0] = "test"; 
printf("%s", aPtr[0]); 

を行うことで、よりエレガントかつ堅牢なアプローチをより同じを割り当てることであろう(と同様に必須のエラーチェックを追加)です。これにより

char ** aPtr = malloc(sizeof *aPtr); 
if (NULL == aPtr) 
{ 
    perror("malloc() failed"); 
    exit(EXIT_FAILURE); 
} 

... 
9
char *str; //single pointer 

あなたは1を格納することができます文字列。


array of stringsを保存するために、あなたはこのように宣言する場合は、これはstatic宣言

あるようにメモリを割り当てる必要はありません two dimensional character array

か、他array of character pointersか、他double pointer


char str[10][50]; //two dimensional character array 

が必要


あなたは各ポインタあなたは数にメモリを割り当てる必要があります。ここ

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 

char **str; //double pointer 

にメモリを割り当てるために、配列を介してポインタ

ループ用のメモリを割り当てる必要が

char *str[10]; //array of pointers 
ここ

各ポインタにメモリを割り当てます。配列による

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

そしてループは、あなたが完全に間違ってそれをやっている各ポインタ

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 
-1

にメモリを割り当てます。コードの正しいバージョンは次のようになります。

int main() 
{ 
char *aPtr; 
aPtr =(char*)malloc(20*sizeof(char)); 
aPtr ="This is a test"; 
printf("%s",aPtr); 
} 

ポインタ配列を使用できます。複数の文字列を格納する場合。はい、私はforループを使うのが簡単だと知っています。しかし、私は初心者でも理解できる簡単な方法で説明しようとしています。

int main() 
{ 
char *aPtr[10]; 
aPtr[0] =(char*)malloc(20*sizeof(char)); 
aPtr[0] ="This is a test"; 
aPtr[1] =(char*)malloc(20*sizeof(char)); 
aPtr[1] ="This is a test2"; 
printf("%s\n%s\n",aPtr[0],aPtr[1]); 
} 
+0

最初の例ではメモリがリークします。つまり20バイトです。 'aPtr ="を実行する "これはテストです;"あなたは 'malloc()'が返す参照を失います。このメモリは一度も使用されておらず、プログラムのライブ中には使用されません。 – alk

+0

'sizeof(char)'は定義になります。 'malloc/calloc/realloc'の結果をC言語で必要としないでキャスティングしたり、推薦したりしないでください:http://stackoverflow.com/a/605858/694576 – alk

+0

答えた人のおかげで大きな助けになりました – user2826534

関連する問題