私はCの例でこの構造体を持っています:
typedef struct
{
const char * array_pointers_of_strings [ 30 ];
// etc.
} message;
このarray_pointers_of_stringsをソート文字列用の新しい配列にコピーする必要があります。住所をコピーするだけです。
while ( i < 30 )
{
new_array [i] = new_message->array_pointers_of_strings [i];
// I need only copy adress of strings
}
私の質問は次のとおりです。文字列のアドレスのみにmalloc()でnew_array [i]を割り当てる方法は?
Whileループの割り当てステートメントから理解できるように、代わりに文字列の配列が必要だと思います。
char** new_array;
new_array = malloc(30 * sizeof(char*)); // ignore casting malloc
注:以下のようにwhileループで=
を実行することにより:
new_array [i] = new_message->array_pointers_of_strings [i];
あなたは文字列のアドレスを割り当てているだけです(ディープコピーではありません)が、「文字列のアドレスのみ」も書いているので、これは何だと思いますあなたが望む。
編集: waring "割り当てはポインターターゲットタイプから修飾子を破棄します"
const-correctnessの規則に違反するconst char*
をchar*
に割り当てているため、この警告が表示されます。
次のようにnew_arrayを宣言する必要があります。
const char** new_array;
orメッセージの制限から 'array_pointers_of_strings'の宣言のconst
を削除します。
この:
char** p = malloc(30 * sizeof(char*));
char
(または文字列ポインター)への30個のポインターを保持するのに十分な大きさのバッファーを割り当て、p
にそのアドレスを割り当てます。
p[0]
はポインター0、p[1]
はポインター1、...、p[29]
はポインタ29です。
古い答え...
質問を正しく理解していれば、message
型の変数を単純に宣言することにより、固定数を作成できます。
message msg1, msg2, ...;
または、動的に割り当てることができます。
message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LEN 2
typedef struct
{
char * string_array [ ARRAY_LEN ];
} message;
int main() {
int i;
message message;
message.string_array[0] = "hello";
message.string_array[1] = "world";
for (i=0; i < ARRAY_LEN; ++i ) {
printf("%d %s\n",i, message.string_array[i]);
}
char ** new_message = (char **)malloc(sizeof(char*) * ARRAY_LEN);
for (i=0; i < ARRAY_LEN; ++i ) {
new_message[i] = message.string_array[i];
}
for (i=0; i < ARRAY_LEN; ++i ) {
printf("%d %s\n",i, new_message[i]);
}
}