web-dev-qa-db-ja.com

Cのmallocで文字列のポインタの配列を割り当てる方法は?

私は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]を割り当てる方法は?

16
user1779502

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を削除します。

14
Grijesh Chauhan

この:

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)), ...;
5
Alexey Frunze
#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]);
    }
}
4
Hal Canary