Arrays ';calloc';关于二维数组';不能正确初始化

Arrays ';calloc';关于二维数组';不能正确初始化,arrays,c,matrix,calloc,Arrays,C,Matrix,Calloc,我试图用C语言定义一个函数来返回一个方阵(NxN): #定义真1 #定义false 0 typedef char bool; 类型定义布尔**矩阵; 矩阵分配(整数大小) { 矩阵矩阵=(bool**)malloc(sizeof(bool)*大小); int i; 对于(i=0;i

我试图用C语言定义一个函数来返回一个方阵(NxN):

#定义真1
#定义false 0
typedef char bool;
类型定义布尔**矩阵;
矩阵分配(整数大小)
{
矩阵矩阵=(bool**)malloc(sizeof(bool)*大小);
int i;
对于(i=0;i
但是,
calloc()
似乎没有像预期的那样用零初始化“单元”。我被告知
calloc
对于初始化是安全的,所以我相信我的逻辑有漏洞。以下是运行这两个功能时的输出(例如,创建9x9矩阵):


分配中的大小错误:
matrix
是指向
bool*
的指针,而不是指向
bool

避免错误,请将大小设置为取消引用的指针,而不是类型

C中不需要强制转换,应该省略

//                                  too small
// Matrix matrix = (bool **) malloc(sizeof(bool) * size);
Matrix matrix = malloc(sizeof *matrix * size);
#包括
#包括
内部主(内部argc、字符**argv、字符**envp){
int行=3,cols=2,i,j;
char*myName=(char*)calloc(rows*cols,sizeof(char));
char chTemp='a';
//Kh
//艾尔
//身份证
*(我的名字)='K';*(我的名字+1)='h';*(我的名字+2)='a';*(我的名字+3)='l';*(我的名字+4)='i';*(我的名字+5)='d';

对于(i=0;它不是一个“二维”数组。
矩阵
是一个指针数组,指向指向
bool
的单个和单独的一维指针数组。请参阅使用
#包含
以获得标准方式定义的
bool
true
false
。您可能想了解[在typedefs后面隐藏指针](
https://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointers
)指针指向指针正是我在代码中所做的,@AndrewHenleAwesome tip,@JonathanLeffler!谢谢。我花了一些时间才理解你的观点,但我明白了……将代码更改为
malloc(sizeof(bool*)*size)
(刚刚在
sizeof
函数中添加了
*
,它工作起来很有魅力!@J.L.Muller:Coding
sizeof(bool*)
sizeof*矩阵
维护成本更高,更难检查,更容易出错。您的选择。
//                                  too small
// Matrix matrix = (bool **) malloc(sizeof(bool) * size);
Matrix matrix = malloc(sizeof *matrix * size);
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp) {
    int rows=3, cols=2, i, j;
    char *myName = (char *) calloc(rows*cols, sizeof(char));
    char chTemp = 'a';
    //Kh
    //al
    //id
    *(myName)='K'; *(myName+1)='h'; *(myName+2)='a'; *(myName+3)='l'; *(myName+4)='i'; *(myName+5)='d';
    for(i=0; i<rows; i++){
        for(j=0; j<cols; j++){
            chTemp = *(myName+i*cols+j);
            printf("%c", chTemp);
        }
        printf("\n");
    }
    return (EXIT_SUCCESS);
}