2017-10-28 62 views
0

我想使一些成功的二維動態字符串數組,但由於某種原因兩個int變量,這實際上是行數(指針數組)和大小(可以多久),變成一個神祕的價值。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'應該是您輸入字符串的最大長度,並且*符合*那個長度,那麼您的分配大小就會被忽略。你不會考慮終止nullchar房間。而Fyi,在這個代碼中我不需要三重間接,我可以看到。另外,這會像篩子一樣泄漏內存,並且會在'arr_pf_p'中孤立動態分配內存。最後(無關),[不要在C程序中投射'malloc'](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。它可以毫不誇張地說,並可以很容易地隱藏不好。 – WhozCraig

+1

您的'arr_of_p'函數將同一個靜態字符串'「helo \ n」'分配給's_p'中的所有指針。因此,在'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

codeblocks說,只要你這樣配置警告。查看編譯器選項。見http://wiki.codeblocks.org/index.php/FAQ-Compiling_(errors) –