web-dev-qa-db-ja.com

ポインター配列の動的メモリ割り当て

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

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

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


printf("%s",aPtr[0]);
19
user2826534

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.
19
dasblinkenlight
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);
9
Gangadhar
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);
}

...
5
alk