2017-10-28 12 views
0

몇 가지 성공했지만 실제로는 행의 수 (포인터의 배열)와 크기 인 두 가지 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; 
} 
+1

'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

+1

'arr_of_p' 함수는's_p'에있는 모든 포인터에 동일한 정적 문자열'helo \ n "을 할당하고 있습니다. 따라서 'main'에있는 루프의 앞부분에 문자열을위한 공간을 할당했는지는 중요하지 않습니다. 모든 메모리가 유출되고 있습니다. 또한,'arr_of_p'의'char *** p' 인자는 여러분이 원하는 것이 아닙니다. 그래서'p [i] = ...'줄도 틀리다. (컴파일러에 대한 경고가 없다는 것을 확신 할 수 있는가?) –

+0

실제로 int 변수가 밟히고있는 이유이다.'arr_of_p'는 값에 대한 정적 문자열. –

답변

1

1) 경고에 대한 옵션을 사용하여 코드를 컴파일하고 메시지

t.c: In function ‘write’: 
t.c:11:18: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=] 
     printf("%s", p[i]); 
       ^
t.c:6:40: warning: unused parameter ‘size_c’ [-Wunused-parameter] 
void write (char ***p, int size_r, int size_c) 
             ^~~~~~ 
t.c: In function ‘arr_of_p’: 
t.c:21:14: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] 
     p[i] = "helo\n"; 
      ^
t.c:16:43: warning: unused parameter ‘size_c’ [-Wunused-parameter] 
void arr_of_p (char*** p, int size_r, int size_c) 


            ^~~~~~ 

2

) 잘못 것으로 보인다 무엇인지 명시 적으로 예를 제공을 참조하십시오.

3) write과 같은 공통 함수 이름을 함수 이름으로 사용하지 마십시오.

+0

코드 블럭을 사용하는데 전혀 경고가 없습니다. –

+0

코드 블록은 경고를 구성하는 즉시 경고를 표시합니다. 컴파일러 옵션을 참조하십시오. http://wiki.codeblocks.org/index.php/FAQ-Compiling_(errors)를 참조하십시오. –