【问题标题】:Segmentation fault in 2D array unsigned char using calloc in C在 C 中使用 calloc 的二维数组 unsigned char 中的分段错误
【发布时间】:2015-08-18 00:00:24
【问题描述】:

我正在尝试使用 calloc 分配unsigned char**

newmatriz = (unsigned char**) calloc(width, sizeof(unsigned char));

for (j=0 ; j < width; j++)
{
    if (newmatriz[j]=(unsigned char*)calloc(witdh, sizeof(unsigned char)) == NULL){
        printf("Memory allocation error. Exit program\n");
        exit(1);
    }
}

for (i=0;i<width;i++)
{
    for(j=0;j<width;j++)
    {
        newmatriz[i][j] = 0;
    }
}

但是当我尝试访问 pos [i][j] 时出现分段错误

问题是否与使用 int 作为迭代器有关?

【问题讨论】:

  • 应该是newmatriz=calloc(width, sizeof(unsigned char*))
  • 不要calloc()&friends返回的那样转换void *。另外:不要使用sizeof(char)(签名/未签名相同)。这永远不会与 1 不同,因为这是标准明确定义的。
  • 代码缺少星号(参见 BLUEPIXY 的评论)。投票结束是一个错字。
  • 我从 calloc 中删除了强制转换,实际上仍然得到相同的错误,我在编译时收到此警告:filtrodefinitivo.c:298:29: 警告:赋值使指针从没有强制转换的整数 [启用默认情况下] if (newmatriz[j]=calloc(width, sizeof(unsigned char)) == NULL){
  • @user3055867,这是不显式转换 malloc 系列函数的返回值的一个很好的理由。您使用显式强制转换隐藏了一个问题。

标签: c arrays char unsigned calloc


【解决方案1】:

在第二个calloc() 中缺少一些括号:

if (newmatriz[j] = calloc(witdh, sizeof(unsigned char)) == NULL){

应该是

if ((newmatriz[j] = calloc(witdh, sizeof(unsigned char))) == NULL){

否则,calloc()s 的结果将与 NULL 进行比较,比较的结果而不是指针存储在 newmatriz[j]

【讨论】:

    【解决方案2】:

    此语句中有错字。而不是sizeof( unsigned char ),你必须使用sizeof( unsigned char * )

    newmatriz = (unsigned char**) calloc(width, sizeof(unsigned char *));
                                                                ^^^^^^
    

    if 语句也不正确

    if ( newmatriz[j] = calloc(witdh, sizeof(unsigned char) ) == NULL){
    

    在此语句中,newmatriz[j] 设置为 1 或 0,具体取决于内存分配是否成功。

    我想你是说

    if ( ( newmatriz[j] = calloc(witdh, sizeof(unsigned char) ) ) == NULL){
    

    还有这些循环

    for (i=0;i<width;i++)
    {
        for(j=0;j<width;j++)
        {
            newmatriz[i][j] = 0;
        }
    }
    

    没有意义,因为calloc 已将分配的内存初始化为零。

    【讨论】:

    • 嗨,指针正在修复,循环只是为了检查对矩阵的访问,但我得到了分段错误。
    • @user3055867 查看我更新的帖子。下次请尝试复制并粘贴至少一个演示问题的编译示例。
    • 谢谢!!那是错误!现在它编译时没有任何警告并且似乎可以工作!
    • @user3055867 你应该时刻注意警告。
    【解决方案3】:

    答案很简单 newmatriz 是一个指向 unsigned char* 的数组(又名指针),您正在分配 unsigned char 只需更改顶行以分配正确大小的数组,在这种情况下,您需要一个字节大小的数组 width*sizeof(unsigned char*) 不是width*sizeof(unsigned char) 就像你现在拥有的一样。

    newmatriz = (unsigned char**) calloc(width, sizeof(unsigned char*));
    for (j=0 ; j < width; j++){
        if (newmatriz[j]=(unsigned char*)calloc(witdh, sizeof(unsigned char)) == NULL){
           printf("Memory allocation error. Exit program\n");
            exit(1);
        }
    }
    

    【讨论】:

    • 我以前和现在也试过了,但还是不行。
    • 应该可以工作,只要你没有耗尽你正在测试的内存。
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2016-05-07
    • 2011-10-12
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多