我正在工作一个需要重入的函数-该函数被赋予一个内存缓冲区作为参数,并且应将此类缓冲区用于其所有内存需求。换句话说,它不能使用malloc,而应该使用提供的缓冲区来绘制内存。

我遇到的挑战是如何在给定大小的char数组上覆盖字符串数组(缓冲区以char *形式提供),但是我的结果是字符串数组(char **)。

下面是一个副本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 100
#define INPUT_ARRAY_SIZE 3

char *members[] = {
        "alex",
        "danny",
        "max"
};


int main() {
    // this simulates a buffer that is presented to my func
    char *buffer = malloc(BUFFER_SIZE);
    char *orig = buffer;
    memset(buffer, NULL, BUFFER_SIZE);

    // pointers will be stored at the beginning of the buffer
    char **pointers = &buffer;

    // strings will be stored after the pointers
    char *strings = buffer + (sizeof(char *) * INPUT_ARRAY_SIZE);

    for(int i = 0; i < INPUT_ARRAY_SIZE; i++) {
        strncpy(strings, members[i], (strlen(members[i]) + 1));
        // Need to store pointer to string in the pointers section
        // pointers[i] = strings; // This does not do what I expect
        strings += ((strlen(members[i]) + 1));
    }

    for (int i=0; i < BUFFER_SIZE; i++) {
        printf("%c", orig[i]);
    }

    // Need to return pointers
}


注释掉有问题的行后,上面的代码将输出:

                alex danny max


但是,我需要一些帮助来弄清楚如何在开始时写入字符串的地址。
当然,如果有完成此任务的简便方法,请告诉我。

最佳答案

这里看看这个。

/* conditions :
 *
 * 'buffer' should be large enough, 'arr_length','arr' should be valid.
 *
 */

char ** pack_strings(char *buffer, char * arr[], int arr_length)
{

    char **ptr = (char**) buffer;
    char *string;
    int index = 0;

    string = buffer + (sizeof(char *) * (arr_length+1));  /* +1 for NULL */
    while(index < arr_length)
    {
        size_t offset;

        ptr[index] = string;
        offset = strlen(arr[index])+1;
        strcpy(string,arr[index]);

        string += offset;
        ++index;
    }
    ptr[index] = NULL;
    return ptr;
}


用法

   char **ptr = pack_strings(buffer,members,INPUT_ARRAY_SIZE);

   for (int i=0; ptr[i] != NULL; i++)
       puts(ptr[i]);

10-04 14:43
查看更多