0

次のようなことをしたい (またはする必要がある)

char **my_array = malloc(1000*64);
strcpy(arr[0], "test");

arr[0] が割り当てられたメモリの別の部分を指していないことはわかっていますが、このように文字列をコピーできるはずだと思いました(それでもセグメント化されています)。これは機能します

arr[0] = "test";

ただし、私の実際の目標は共有メモリでこれを行うことであるため、うまくいきません。

shm_array = shmget(IPC_PRIVATE, 1000 * 64, IPC_CREAT | 0644);
my_array = (char**) shmat(shm_array, (void**)0, 0);

実際、私の質問は「共有メモリに文字列の配列を作成するにはどうすればよいですか?」と言い換えることができます。1000 個の個別の「文字列」共有メモリ セグメントを作成しようとしましたが、それ以外はうまくいきませんでした。さらに、相対ポインターオフセットを使用して、大きな共有メモリセグメントに簡単に書き込むことができるはずだと思いました。

4

3 に答える 3

1

1000 x 64 の 2D 配列を探しているようです。これが実際に当てはまる場合は、次のように実行できます。

struct shared_1000_by_64 {
    char strings[1000][64];
};

struct shared_1000_by_64 *shared = malloc(sizeof(struct shared_1000_by_64));
for (int i = 0 ; i != 1000 ; i++) {
    strcpy(shared->strings[i], "test");
}

これは、配列がポインターに崩壊するのを防ぐ標準的なトリックを使用します。

于 2012-04-07T11:08:11.277 に答える
1

単一のメモリを作成し、特定のオフセットに書き込むことができます。

char * const buf = malloc(HUGE);

strcpy(buf + offset1, "hello");
strcpy(buf + offset2, "world");

最後に実行しないようにするにはstrncpy、サイズを使用して渡す方がおそらく良いでしょう。HUGE - offsetオフセットの管理は、ユーザー自身の責任です。またはstrncat、効率がそれほど重要でない場合は、 を使用できます。

于 2012-04-07T11:02:05.857 に答える
0

64 文字の配列の配列を動的に割り当てたい場合は、ポインターへのポインターではなく、配列へのポインターを使用します。

char (*my_array)[64] = malloc(1000 * sizeof my_array[0]);
strcpy(my_array[0], "test");

または共有メモリの場合、

shm_array = shmget(IPC_PRIVATE, 1000 * sizeof my_array[0], IPC_CREAT | 0644);
my_array = shmat(shm_array, NULL, 0);
于 2012-04-07T11:47:32.080 に答える