我正在工作一个需要可重入的函数 - 该函数被赋予一个内存缓冲区作为参数,并且应该使用这样的缓冲区来满足其所有内存需求。换句话说,它不能使用 malloc,而是应该从提供的缓冲区中提取内存。
我遇到的挑战是如何将字符串数组覆盖在给定大小的字符数组上(缓冲区以 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]);
关于c - 将字符串数组覆盖在字符数组上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058678/