テキストファイルから一連の文字列を読み取り、文字列の配列に保存し、各要素にメモリを動的に割り当てるプログラムを作成しようとしています。私の計画は、ポインターを使用して各文字列を配列に格納し、読み込まれるにつれて配列サイズを大きくすることでした。以下のテストコードが機能しない理由を理解するのが困難です。これは実行可能なアイデアですか?
char *aPtr;
aPtr =(char*)malloc(sizeof(char));
aPtr[0]="This is a test";
printf("%s",aPtr[0]);
Cでは、文字列は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.
char *str; //single pointer
これにより、1つの文字列を保存できます。
格納するにはarray of strings
必要なtwo dimensional character array
または、array of character pointers
またはその他double pointer
char str[10][50]; //two dimensional character array
このように宣言する場合、これは静的宣言であるため、メモリを割り当てる必要はありません。
char *str[10]; //array of pointers
ここでは、各ポインターにメモリを割り当てる必要があります
配列をループして、各ポインターにメモリを割り当てます
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char **str; //double pointer
ここでは、ポインタの数にメモリを割り当ててから、各ポインタにメモリを割り当てる必要があります。
str=malloc( sizeof(char *)*10);
そして、配列をループして各ポインタにメモリを割り当てます
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char * aPtr;
1
文字を正確に保持するためにメモリを割り当てた文字へのポインタとして。
やること
aPrt[0] = "test";
このone文字のメモリをアドレス指定し、リテラル"test"
のアドレスを保存しようとします。このアドレスはほとんどのリクリーがキャラクターよりも広いため、これは失敗します。
コードの修正は、文字へのポインターにメモリを割り当てることです。
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);
}
...