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

您可以只创建一块内存并写入特定的偏移量:

char * const buf = malloc(HUGE);

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

strncpy使用并传递一个大小可能会更好,HUGE - offset以确保你不会跑到最后。管理偏移量是您自己的责任。或者你可以使用strncat,如果效率不那么重要的话。

于 2012-04-07T11:02:05.857 回答
1

看起来您正在寻找一个 1000 x 64 的二维数组。如果确实如此,您可以这样做:

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 回答
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 回答