![](/img/trans.png)
[英]C: ERROR After mallocing and passing 2D char array to function
[英]passing a char 2d array into a void function in c
我是 c 的新手,但我已經嘗試了很長時間,試圖讓它工作,盡管它看起來很簡單。
所以下面是我打算做的工作,但我想制作 2 個函數:fillseats() 和 printseatingplan()[現在我只希望它們全部空白];
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char seatingplan[15][15];
memset(seatingplan,'.',sizeof seatingplan);
for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c",seatingplan[k][j]);
}
printf("\n");
}
}
因此,每當我嘗試在沒有指針的情況下運行這些函數時,它都會給我這些 �`:�ij:�i�d:�iH@=�i�B��ik:�
我怎樣才能使用指針來解決這個問題
我可以將這個數組傳遞給 printseatingplan() 所在的函數嗎
void printseatingplan(char array[15][15])
{
for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c",array[k][j]);
}
printf("\n");
}
}
然后 fillseats() 做:
void fillseats(char array[15][15])
{
memset(array,'.',sizeof array);
}
sizeof
只會給你指針的大小,而不是整個數組。
您需要將大小傳遞給 function。我會使用指向數組的指針:
void fillseats(size_t rows, size_t cols, char (*array)[cols])
{
memset(array,'.',rows * sizeof(*array));
}
void printseatingplan(size_t rows, size_t cols, char (*array)[cols])
{
for (size_t row = 0; row < rows; row++)
{
for(size_t col = 0; col < cols; col++)
{
printf("%c",array[row][col]);
}
printf("\n");
}
}
char array[15][15]
當用作 function 的參數時“衰減”為指向第一個元素的指針,在本例中相當於char (*array)[15])
。 如果您執行sizeof array
而不是 function,您將獲得指針的大小(4 或 8 等)。 如果你執行sizeof *array
,你只會得到一維的大小,15。
一個簡單的修復方法:
#include <stdio.h>
#include <string.h>
void fillseats (size_t x, size_t y, char array[x][y])
{
memset(array, '.', sizeof(char[x][y]));
}
void printseatingplan (size_t x, size_t y, char array[x][y])
{
for (size_t i = 0; i < x; i++)
{
for(size_t j = 0; j < y; j++)
{
printf("%c",array[i][j]);
}
printf("\n");
}
}
int main (void)
{
char seatingplan[15][15];
fillseats(15, 15, seatingplan);
printseatingplan(15, 15, seatingplan);
}
數組的大小與其類型有關。 問題是數組類型的參數衰減為指針。 為了防止它,您可以傳遞一個指向數組的指針。 指針不會衰減,因此數組類型的基本部分占上風。
void printseatingplan(char (*array)[15][15])
{
for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c", (*array)[k][j]);
}
printf("\n");
}
}
void fillseats(char (*array)[15][15])
{
memset(*array,'.',sizeof *array);
}
int main (void)
{
char seatingplan[15][15];
fillseats(&seatingplan);
printseatingplan(&seatingplan);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.