C strcpy转换为共享内存中的字符串数组



我想(或需要)做一些类似的事情

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个单独的"字符串"共享内存段,但除此之外,它不起作用,似乎也是错误的。此外,我认为应该能够简单地使用相对指针偏移量写入一个大的共享内存段。

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

char * const buf = malloc(HUGE);
strcpy(buf + offset1, "hello");
strcpy(buf + offset2, "world");

最好使用strncpy并传递大小为HUGE - offset的值,以确保不会超过终点。管理补偿是您自己的责任。如果效率不那么重要的话,也可以使用strncat

看起来您正在寻找一个1000乘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");
}

这使用了防止数组衰减为指针的标准技巧。

如果要动态分配一个由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);

最新更新