문제
나는 현재 C를 배우려고 노력하고 있으며 내가 해결할 수 없었던 문제에 왔습니다.
고려하다:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENTS 5
void make(char **array, int *array_size) {
int i;
char *t = "Hello, World!";
array = malloc(ELEMENTS * sizeof(char *));
for (i = 0; i < ELEMENTS; ++i) {
array[i] = malloc(strlen(t) + 1 * sizeof(char));
array[i] = strdup(t);
}
}
int main(int argc, char **argv) {
char **array;
int size;
int i;
make(array, &size);
for (i = 0; i < size; ++i) {
printf("%s\n", array[i]);
}
return 0;
}
위의 위의 배열이 배열을 작성한 후에 다시 읽지 못하는 이유를 모르겠습니다. 나는 왜 그것이 실패했는지 이해하려고 한 시간을 보냈지 만 빈손으로 올라 왔습니다. 의심 할 여지없이 그것은 사소한 것입니다.
건배,
해결책
작업 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENTS 5
void make(char ***array) {
char *t = "Hello, World!";
*array = malloc(ELEMENTS * sizeof(char *));
int i;
for (i = 0; i < ELEMENTS; ++i) {
(*array)[i] = strdup(t);
}
}
int main(int argc, char **argv) {
char **array;
make(&array);
int i;
for (i = 0; i < ELEMENTS; ++i) {
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
return 0;
}
다른 사람이 게시 한 것처럼 - 미사용 크기가 있었고 Strdup은 메모리를 그 자체로 할당하며 나중에 메모리를 해방시키는 것이 좋습니다 ...
다른 팁
"배열"주소를 함수로 전달해야합니다. 즉, char ***가 필요합니다. 메모리를 할당하여 배열 값을 변경해야하기 때문입니다.
편집 : 기능 선언에서 더 완료하기 위해서는 다음과 같은 것을 가지고 있어야합니다.
void make(char ***array, int *array_size)
그런 다음 사용하여 호출해야합니다
make(&array, &size);
함수 내부 만들다, 메모리를 할당하십시오
*array = malloc(ELEMENTS * sizeof(char *));
그에 따라 다른 장소를 변경합니다.
또한 Kauppi가 지적했듯이 Strdup은 귀하를 위해 메모리를 할당하므로 각 문자열에서 Malloc을 수행 할 필요가 없습니다.
절대적으로 발견 된 Polythinker의 의견을 참조하십시오.
배열을 통과하는 방법 외에도 몇 가지 다른 문제를 확인해야합니다.
- 아마도 make (...)에서 array_size에 무언가를 할당해야할까요?
- strdup (char*)는 메모리를 할당하고 배열에 대한 malloc은 필요하지 않습니다.
- 더 이상 필요하지 않은 후에 할당 한 모든 메모리를 자유롭게해야합니다.
당신은 현재의 사본으로 만들기 할 배열 값 (스택에). Make ()에서 배열을 변경하면 실제 변수가 아니라 사본 만 변경합니다. &와 함께 참조로 통과하거나 char ***로 만들고 *array = ...에서 작업하십시오.
크기는 선언되었지만 할당 된 값은 없습니다 (기능이 만들어야한다고 생각합니다).