我正在嘗試在輔助函式中初始化矩陣,但在訪問輔助函式中的矩陣時收到警告,我不知道如何修復。我正在閱讀多維陣列,甚至在多個示例中看到了用于傳遞和訪問矩陣的相同符號,但我的生成了警告,我不太確定為什么。
據我所知,這個錯誤意味著引數不是函式期望的型別,但在將初始化重新定位到它自己的函式之前,我在主函式中使用它就好了。這讓我認為在將矩陣傳遞給輔助函式時我做錯了什么。
passing argument 1 of 'memmove' makes pointer from integer without a cast [-Wint-conversion]
這是我的初始化程式代碼。p 是指向陣列內資料的指標,我想將其初始化到我的矩陣中。我正在使用這種型別的嵌套 for 回圈將來自 p 的 16 位元組資料傳播到我的矩陣中,每個單元格 1 位元組。
void initialize(const unsigned char *p, unsigned char (*matrix)[4]) {
for (unsigned int i = 0; i < 4; i ){
for (unsigned int j = 0; j < 4; j ){
memmove(matrix[i][j], p (4*i j), 1); <--- Warning here
};
};
};
Initialize 在另一個函式中被呼叫,如下所示:
void func(const unsigned char *p) {
unsigned char matrix[4][4] = {
{0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0}
};
initialize(p, matrix);
};
uj5u.com熱心網友回復:
函式memmove()將指標作為第一個引數。Whilematrix[i][j]是一個char,來自整數系列的型別。將常量 0 以外的整數賦給指標需要強制轉換。否則會發出警告。
因此,我希望為了復制單個,char您應該傳遞一個指向element的指標matrix[i][j]。指標是通過將&運算子應用于物件而形成的。
memmove(&matrix[i][j], p (4*i j), 1);
然而,它可以寫得更簡單、更易讀并且可能更優化:
matrix[i][j] = p[4 * i j];
甚至不帶任何回圈地復制整個陣列:
memmove(matrix, p, 16);
uj5u.com熱心網友回復:
傳遞“memmove”的引數 1 使指標來自整數而不進行強制轉換 [-Wint-conversion]
而不是傳遞一個整數值作為目標:
unsigned char (*matrix)[4]
...
// v----------v This is an integer of type unsigned char
// memmove(matrix[i][j], p (4*i j), 1);
傳遞整數的地址作為目標:
memmove(&matrix[i][j], p (4*i j), 1);
// ^-----------^ This is an address
void *memmove(void *s1, const void *s2, size_t n);期望s1是一個地址。
matrixinfunc() 是一個矩陣,又名“二維陣列”。
matrixininitialize()并不是一個真正的矩陣,而是一個指向array[4]of的指標unsigned char。
從 C99 開始,選擇性地之后,代碼可以使用可變長度陣串列示法。
void initialize(size_t rows, size_t cols, unsigned char (*m)[rows][cols],
const unsigned char *p) {
printf("%zu %zu %zu\n", rows, cols, sizeof *m);
for (size_t r = 0; r < rows; r ){
for (size_t c = 0; c < cols; c ){
(*m)[r][c] = *p ;
}
}
}
#define ROW 5
#define COL 7
int main(void) {
unsigned char matrix[ROW][COL];
unsigned char bytes[sizeof matrix] = "Something abcde fghij klmno pqrst uvwxy z";
size_t r = sizeof matrix / sizeof matrix[0];
size_t c = sizeof matrix[0] / sizeof matrix[0][0];
printf("%zu %zu %zu\n", r, c, sizeof matrix);
initialize(r, c, &matrix, bytes);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372825.html
上一篇:C中陣列初始化的區別
下一篇:雙結構指標的分配
