2016-05-11 6 views
1

私はちょっとした問題を抱えています。私の英語はすごく残念です.2番目は行列を2次元にしていますが、私はワークメモリに問題があります。なぜそれが動作しないのか分かりません。コードはCで書かれています。私は1つ以上の文字列を設定して配列に保存したいのですが、これは配列の容量を動的に増やす必要があります。2次元マトリックスCでreallocが動作しない

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

次の関数で

int main() 
{ 
char *stringg = NULL; 

insertString(&stringg); 

free(stringg); 
return 0; 
} 

typedef struct { 
int rows; 
int col; 
int flagPosition; 
int wordBiggest; 
int tamanioString; 
} matrixTest; 

int insertString(char **matriz); 
void rellenarMatriz(char **matriz, char string[], matrixTest *datosMatriz); 
int getElementBiggest(char **matriz, int size); 

主な構造体を作成し、私は別の関数に送った後、この文字列を、私は、構造体を初期化し、私は、文字列をロードしていますrellenarMatrizと呼ばれる。それまではすべて大丈夫です。

int insertString(char **matriz){ 

char __string[300]; 
int i = 0; 
int sizeRow = 0; 
matrixTest datosMatriz = { 1,1,0,0,0 }; 

matriz = (char **) calloc(datosMatriz.rows, sizeof(char *)); 

for (i = 0; i < datosMatriz.rows; i++) 
    matriz[i] = (char*)calloc(datosMatriz.col, sizeof(char)); 

puts("User say: "); 

while(fgets(__string, 300, stdin)){ 
    puts("User say: "); 
    i = 0; 
    sizeRow = 1; 

    while(i < strlen(__string) - 1 ){ 
     if(__string[i] == ' ') 
      sizeRow++; 
     i++; 
    } 

    datosMatriz.tamanioString = strlen(__string) - 1; 
    datosMatriz.rows = datosMatriz.rows + sizeRow; 
    datosMatriz.flagPosition = sizeRow; 

    rellenarMatriz(matriz, __string, &datosMatriz); 
} 

return 0; 
} 

ここが問題です。realloc関数とcalloc関数を見てください。私はクレイジー

void rellenarMatriz(char **matriz, char string[], matrixTest *datosMatriz){ 

int i = 0, 
    j = 0; 

datosMatriz->wordBiggest = getElementBiggest(&string, datosMatriz->tamanioString); 

if(datosMatriz->col < datosMatriz->wordBiggest){ 

    (*matriz) = realloc((*matriz), (datosMatriz->wordBiggest) * sizeof(char *)); 

    for(i = datosMatriz->col; i < datosMatriz->wordBiggest; i++){ 
     matriz[i] = calloc(1, sizeof(char)); 
    } 
    datosMatriz->col = datosMatriz->wordBiggest; 
} 

for(i = 0; i < datosMatriz->col; i++) 
    (*matriz) = realloc(matriz[i], (datosMatriz->rows) * sizeof(char *)); 

for(i = 0; i < datosMatriz->col; i++){ 
    for(j = datosMatriz->rows-datosMatriz->flagPosition; j < datosMatriz->rows; j++) 
     matriz[i][j] = calloc(1, sizeof(char)); // Here is the biiig problem. Warning: assignment makes integer from pointer without a cast| 
} 

for(i = 0; i < datosMatriz->rows; i++){ 
    for(j = 0; j < datosMatriz->col; j++){ 
     printf("%d and %d\n", i, j); 
     matriz[i][j] = 'a'; 
    } 
} 

for(i = 0; i < datosMatriz->rows; i++){ 
    puts("\t"); 
    for(j = 0; j < datosMatriz->col; j++) 
     printf("[%c]", matriz[i][j]); 
    puts("\n"); 
} 
} 

これは、あなたが英語で私の改訂で間違いを見つけた場合、私に教えてください。また

int getElementBiggest(char **matriz, int size){ 

int i = 0, 
    biggest = 0, 
    countWord = 0; 

for(i = 0; i < size; i++){ 
    if((char)(*matriz)[i] == ' '){ 
     if(countWord > biggest) 
      biggest = countWord; 
     countWord = 0; 
    } 
    else 
     countWord++; 
} 
return biggest; 
} 

問題ではない、私はそれを勉強していますので、良いでしょうが行きますよ私の構文を訂正してください。

+1

'マトリズ=(文字**)はcalloc(...'ああ、あなたは入力を破りました。 – MikeCAT

+0

'insertString'が間違っています。ローカル変数のみを変更します。 'rellenarMatriz'では、あなたは完全な次元で同期しています。 'main'の変数は' char ** 'でなければなりません。 –

+1

私はあなたのメモリ割り当てコードをメモリに書き込むコードとは別に書くことをお勧めします。これにより、コードのデバッグと保守が容易になります。 –

答えて

0

このライン:

matriz[i][j] = calloc(1, 1); 

は、ターゲットを持っている:matriz[i][j]は、コンパイラが注意し、また、警告メッセージ

を出力している理由である配列matrix[i]

で単一の文字を参照します。このコードブロック:

for(i = 0; i < datosMatriz->col; i++) 
    (*matriz) = realloc(matriz[i], (datosMatriz->rows) * sizeof(char *)); 

は同じポインタを何度も何度も再割り当てしています。また

、注:この行:この行::

char *stringg = NULL; 

free(stringg); 

のみ無料最初の配列、のcallocによって作成されていない他のすべてのアレイ()も

、ノートです

は単一のポインタを宣言していますが、次のように宣言されているかのように使用されています。

char **stringg = NULL; 
経由

、それが宣言されたかのようにコード内の問題の行がそれを処理している:

char ***stringg = NULL; 
関連する問題