-1
我正在工作一個需要重入的函數 - 該函數被賦予一個內存緩衝區作爲參數,並且應該使用這樣的緩衝區來滿足其所有的內存需求。換句話說,它不能使用malloc,而應該提供內存提供的緩衝區。在char數組上覆蓋字符串數組
我碰到的挑戰是如何將字符串數組覆蓋給定大小的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
不過,我需要搞清楚如何寫的地址,一些援助字符串在開始。 當然,如果有更簡單的方法來完成這項任務,請讓我知道。
無關你的問題,而是'NULL'是一個空指針* *,而不是一個 「空值」。如果你想使用'memset'將內存設置爲零,那麼使用整數零'0'。 –
至於你的問題,請記住數組自然衰減到指向它們的第一個元素。這使得你的數組''成員腐敗成爲'&** [成員],這是'char **'類型。所以如果你想用你的內存作爲一個指針數組,你應該使用'char **'類型的變量,就像你的'pointers'變量,但是初始化爲指向'buffer'的第一個字節(而不是地址變量'緩衝區')。然後你可以像指針數組一樣使用'指針'並初始化它的成員來指向你複製到緩衝區的字符串。 –
在另一個不相關的說明中,如果您要複製完整字符串和終止符,爲什麼要使用'strncpy'?爲什麼不用簡單的'strcpy'來代替? –