몇 가지 성공했지만 실제로는 행의 수 (포인터의 배열)와 크기 인 두 가지 int 변수를 사용하여 2 차원 동적 문자열 배열을 만들려고합니다. 문자열의 길이 (얼마나 될 수 있는지), 신비한 가치로 변경하십시오.int 변수가 이상하게 void에서 반환 된 후 값을 변경합니다.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void write (char ***p, int size_r, int size_c)
{
int i;
for (i = 0; i < size_r; i++)
{
printf("%s", p[i]);
}
return;
}
void arr_of_p (char*** p, int size_r, int size_c)
{
int i;
for (i = 0; i < size_r; i++)
{
p[i] = "helo\n";
}
return;
}
int main(void)
{
int string_n; printf("How many strings: "); scanf("%d", &string_n);
int string_l; printf("How long are the strings: "); scanf("%d", &string_l);
char **s_p = (char**) malloc(string_n*sizeof(char*));
int i;
for (i = 0; i < string_n; i++)
{
s_p[i] = (char*) malloc(string_l*sizeof(char));
}
arr_of_p(&s_p, string_n, string_l);
printf("%d\n%d\n", string_n, string_l); // for debugging purpose, add breakpoint here.
//"string_n" and "string_l" will be identical to the value of "i" in "arr_of_p()" for some reason...
write(&s_p, string_n, string_l);
return 0;
}
'string_l'이 입력 문자열의 최대 길이라고 가정하고 그 길이를 * 충족 시키면 그 할당 크기는 1입니다. nullchar 룸 종료를 고려하지 않았습니다. 그리고 Fyi, 내가 볼 수있는이 코드에는 3 중 간접 검색이 필요하지 않습니다. 또한, 이것은 sieve처럼 메모리를 누출하고,'arr_pf_p'에서 동적 할당을 고아로 만듭니다. 마지막으로 (관련이없는) [C 프로그램에서 malloc을 캐스트하지 마십시오] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). 그것은 말 그대로 문자 그대로 좋을 수는 없으며, 쉽게 나쁘게 숨길 수 있습니다. – WhozCraig
'arr_of_p' 함수는's_p'에있는 모든 포인터에 동일한 정적 문자열'helo \ n "을 할당하고 있습니다. 따라서 'main'에있는 루프의 앞부분에 문자열을위한 공간을 할당했는지는 중요하지 않습니다. 모든 메모리가 유출되고 있습니다. 또한,'arr_of_p'의'char *** p' 인자는 여러분이 원하는 것이 아닙니다. 그래서'p [i] = ...'줄도 틀리다. (컴파일러에 대한 경고가 없다는 것을 확신 할 수 있는가?) –
실제로 int 변수가 밟히고있는 이유이다.'arr_of_p'는 값에 대한 정적 문자열. –