18

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

4

4 に答える 4

18

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*を to に割り当てているため、この警告が表示されます。char*

次のように new_array を宣言する必要があります。

const  char** new_array;      

またはconst、メッセージ構造から「array_pointers_of_strings」の宣言を削除します。

于 2013-03-28T16:20:16.100 に答える
6

これ:

char** p = malloc(30 * sizeof(char*));

char30個のポインター(または文字列ポインター)を保持するのに十分な大きさのバッファーを割り当て、pそのアドレスに割り当てます。

p[0]はポインター 0、p[1]ポインター 1、...、p[29]ポインター 29 です。


古い答え...

私が質問を正しく理解していれば、型の変数を宣言するだけで固定数の変数を作成できますmessage

message msg1, msg2, ...;

または、それらを動的に割り当てることができます:

message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
于 2013-03-28T16:18:25.730 に答える
4
#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]);
    }
}
于 2013-03-28T16:28:27.353 に答える