문제

나는 현재 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의 의견을 참조하십시오.

배열을 통과하는 방법 외에도 몇 가지 다른 문제를 확인해야합니다.

  1. 아마도 make (...)에서 array_size에 무언가를 할당해야할까요?
  2. strdup (char*)는 메모리를 할당하고 배열에 대한 malloc은 필요하지 않습니다.
  3. 더 이상 필요하지 않은 후에 할당 한 모든 메모리를 자유롭게해야합니다.

당신은 현재의 사본으로 만들기 할 배열 값 (스택에). Make ()에서 배열을 변경하면 실제 변수가 아니라 사본 만 변경합니다. &와 함께 참조로 통과하거나 char ***로 만들고 *array = ...에서 작업하십시오.

크기는 선언되었지만 할당 된 값은 없습니다 (기능이 만들어야한다고 생각합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top