私はちょっとした問題を抱えています。私の英語はすごく残念です.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;
}
問題ではない、私はそれを勉強していますので、良いでしょうが行きますよ私の構文を訂正してください。
'マトリズ=(文字**)はcalloc(...'ああ、あなたは入力を破りました。 – MikeCAT
'insertString'が間違っています。ローカル変数のみを変更します。 'rellenarMatriz'では、あなたは完全な次元で同期しています。 'main'の変数は' char ** 'でなければなりません。 –
私はあなたのメモリ割り当てコードをメモリに書き込むコードとは別に書くことをお勧めします。これにより、コードのデバッグと保守が容易になります。 –