【问题标题】:C strcpy into an array of strings in shared memoryC strcpy 到共享内存中的字符串数组
【发布时间】:2012-04-07 10:57:24
【问题描述】:

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

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

【问题讨论】:

    标签: c shared-memory arrays


    【解决方案1】:

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

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

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

    【讨论】:

    • 这就是我真正想要实现的目标。也适用于共享内存段。
    【解决方案2】:

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

    这使用了防止数组进入decaying into a pointer 的标准技巧。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 2011-07-04
        相关资源
        最近更新 更多