あなたのコードにはいくつか問題があると思います。
matrix = malloc(row_pointer_bytes + nrows * single_row_elements_bytes);
へ:
matrix = malloc(row_pointer_bytes);
行列でuint8_t*
多くの行のためのスペースを割り当て
あなたはこのラインを簡素化することができます。
malloc()
関数はヒープ上に要求されたメモリを割り当てるために必要なバイトsize_t
量を必要とし、それへのポインタを返します。
これは、マトリックスに必要な行数(この場合はnrows
)を単純に割り当てることができます。
また、あなたのforループ:各行がn
の列を持っているので
for(i = 0; i < nrows; i++)
matrix[i] = matrix[nrows + i * single_row_elements_bytes];
は、matrix[i]
にメモリを割り当てません、あなたはそれらの列にメモリを割り当てる必要があります。
これは、代わりに次のようになります。
for(i = 0; i < nrows; i++)
matrix[i] = malloc(single_row_elements_bytes);
もう一つの問題は、single_row_elements_bytes
を割り当てる方法です。代わりに:
size_t single_row_elements_bytes = ncols * sizeof **matrix; //**matrix is uint8_t**
このニーズはn
列、ないuint8_t**
バイトのためuint8_t
バイトを割り当てます。それは代わりに、これをすることができます:
size_t single_row_elements_bytes = ncols * sizeof(uint8_t);
は次のように書かれている場合、これは、あなたのコードをコンパイルすると発表しました。これは私がコードをテストするために書いた例です。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
uint8_t **NewMatrix(unsigned nrows, unsigned ncols);
int
main(int argc, char *argv[]) {
uint8_t **returnmatrix;
unsigned nrows = 2, ncols = 2;
int i, j;
returnmatrix = NewMatrix(nrows, ncols);
for (i = 0; i < nrows; i++) {
for (j = 0; j < ncols; j++) {
printf("Enter number for row %d column %d: ", i+1, j+1);
/* format speficier for uint8_t, from <inttypes.h> */
if (scanf("%"SCNu8"", &returnmatrix[i][j]) != 1) {
printf("Invalid 8 bit number.\n");
exit(EXIT_FAILURE);
}
}
}
printf("\nYour matrix:\n");
for (i = 0; i < nrows; i++) {
for (j = 0; j < ncols; j++) {
printf("%d ", returnmatrix[i][j]);
}
printf("\n");
}
/* Good to free at the end */
free(returnmatrix);
return 0;
}
uint8_t
**NewMatrix(unsigned nrows, unsigned ncols) {
int i;
uint8_t **matrix;
size_t row_pointer_bytes = nrows * sizeof * matrix;
size_t column_row_elements_bytes = ncols * sizeof(uint8_t);
matrix = malloc(row_pointer_bytes);
/* Good to check return value */
if (!matrix) {
printf("Cannot allocate memory for %d rows.\n", nrows);
exit(EXIT_FAILURE);
}
for(i = 0; i < nrows; i++) {
matrix[i] = malloc(column_row_elements_bytes);
if (!matrix[i]) {
printf("Cannot allocate memory for %d columns.\n", ncols);
exit(EXIT_FAILURE);
}
}
return matrix;
}
入力:
Enter number for row 1 column 1: 1
Enter number for row 1 column 2: 2
Enter number for row 2 column 1: 3
Enter number for row 2 column 2: 4
出力:でコンパイル
Your matrix:
1 2
3 4
:別の答えに記載されたさまざまなバグは別に
gcc -Wall -o matrix matrix.c
'matrix [i]'のスペースを割り当てる必要があります。 – RoadRunner
@RoadRunnerは、その領域がすでにmallocによって割り当てられています。私は行列[nrows + i ...]が指す値と同じになるようにポインタを設定しようとしています。 –
@ C.P.私は以下の答えを書いた。 – RoadRunner