[완료] 포인터에 일어나는 부식을 어떻게 없앨 수 있을까요?

yidj0205의 이미지

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
static int good(char* string[]) {
 
    char array[20][100] = { NULL };
    for (int i = 0; i < 20; i++) {
        array[i][0] = 'a'; array[i][1] = 'b'; array[i][2] = 'c'; array[i][3] = '\0';
        string[i] = &array[i];
    }
 
    return 0;
}
 
int main()
{
    char* string[30] = { NULL };
    good(string);
 
    for (int i = 0; i < 20; i++) {
        printf("%s\n", string[i]);
    }
 
    return 0;
}

이중 배열을 string에 넣고 싶습니다. 하지만 string배열에 쓰레기 값이 쌓입니다.
구글링 해본 결과 배열포인터를 사용해야 되는데, 그래도 문제가 발생하네요.
어떻게 해야 해결할까요??

익명 사용자의 이미지

문제의 원인은, good 함수에서 string 배열에 지역 변수인 array의 주소를 채워서 돌려준다는 데 있습니다.
지역 변수의 메모리는 함수가 반환될 때 해제되므로 그 값이 그대로 있으리라는 보장이 없는 것이죠.

실제로 printf는 굉장히 복잡한 함수이기 때문에 스택 메모리를 상당히 사용하므로 array (였던 메모리)의 데이터는 100% 덮였을겁니다.

함수가 반횐되고도 여전히 살아남을 수 있는 메모리가 필요하면 malloc밖에 답이 없지요.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
static int good(char* string[]) {
	char (*parray)[20][100] = malloc(20 * 100);
 
    for (int i = 0; i < 20; i++) {
    	strcpy((*parray)[i], "abc");
        string[i] = (*parray)[i];
    }
 
    return 0;
}
 
int main()
{
    char* string[30] = { NULL };
    good(string);
 
    for (int i = 0; i < 20; i++) {
        printf("%s\n", string[i]);
    }
 
    return 0;
}