재진입해야하는 함수를 작업 중입니다.이 함수는 메모리 버퍼를 인수로 사용하며 모든 메모리 요구에 대해 이러한 버퍼를 사용해야합니다. 즉, malloc을 사용할 수 없으며 제공된 버퍼를 메모리로 가져와야합니다.문자열 배열을 char 배열에 오버레이합니다.
내가 겪었던 문제는 지정된 크기의 char 배열에 문자열 배열을 오버레이하는 방법 (버퍼는 char *으로 제공됨)이지만 내 결과는 문자열 배열 (char **)입니다. 나는의 주소를 작성하는 방법을 알아내는 약간의 도움이 필요하지만
alex danny max
: 주석 문제가있는 줄 인쇄 위의 코드와
#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
}
: 아래
는 생식입니다 처음에는 문자열. 물론이 작업을 수행하는 더 쉬운 방법이 있으면 알려 주시기 바랍니다.
귀하의 질문에 관련없는,하지만. 'memset'을 사용하여 메모리를 0으로 설정하려면 정수 0 '0'을 사용하십시오. –
귀하의 문제에 관해서는, 배열은 자연스럽게 첫 번째 요소에 대한 포인터로 붕괴한다는 것을 기억하십시오. 이렇게하면 배열'멤버 '가'char **'유형의'& members [0]'으로 썩게됩니다. 따라서 포인터를 배열로 사용하고 싶다면, 포인터 변수 대신'char **'형 변수를 사용해야하지만, 주소 대신에'buffer'의 첫 바이트를 가리 키도록 초기화해야합니다 변수 'buffer'의). 그런 다음 포인터의 배열처럼'포인터 '를 사용하고 멤버를 initilize하여 버퍼에 복사 한 문자열을 가리킬 수 있습니다. –
또 다른 관련없는 노트에서 어째 든 전체 문자열과 터미네이터를 복사하려는 경우 왜'strncpy'를 사용해야합니까? 왜 대신에'strcpy'를 쓰지 않으시겠습니까? –