微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查动态分配的二维数组的元素在 C 中是否为 NULL

如何解决如何检查动态分配的二维数组的元素在 C 中是否为 NULL

我有一个动态分配的二维数组指向一个结构。我正在尝试用数字 0 填充数组的 NULL 值。没有错误或警告,只是打印了一些随机值。

这是代码的简化版本:

#include <stdio.h>
#include <stdlib.h>

int rows = 2,cols=3 ;

struct Data
{
    int trail;
};

struct Data** WritingData()
{
    //initializing 2d array
    struct Data **arr = (struct Data**)malloc(rows * sizeof(struct Data*));
    for (int i=0; i<cols; i++)
         arr[i] = (struct Data*)malloc(cols * sizeof(struct Data));

    //giving some values as an example
    (*(arr+0)+0)->trail = 1;
    (*(arr+1)+0)->trail = 1;
    (*(arr+0)+1)->trail = 1;

    //checking if value is NULL to replace with 0
    for (int i = 0; i < rows ; i++) {
        for (int j = 0; j < cols; j++){
              if (!((*(arr+i)+j)->trail))
             (*(arr+i)+j)->trail = 0;
              else continue;
            }
        }

    return(arr);
}

int main()
{
    struct Data **arr = WritingData();

    //printing result
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
        {
        printf(" %d ",(*(arr+i)+j)->trail);
        }
    printf("\n");
    }

    free(arr);
}

解决方法

对于初学者来说这个循环

for (int i=0; i<cols; i++)
              ^^^^^^^
     arr[i] = (struct Data*)malloc(cols * sizeof(struct Data));

不正确。你的意思是

for (int i=0; i<rows; i++)
              ^^^^^^^
     arr[i] = (struct Data*)malloc(cols * sizeof(struct Data));

这个if语句

if (!((*(arr+i)+j)->trail))

没有意义,因为未初始化的对象具有不确定的值,并且函数 malloc 不会初始化分配的内存。

例如,您可以在此循环中使用 calloc 而不是 malloc

for (int i=0; i<rows; i++)
     arr[i] = (struct Data*)calloc(cols,sizeof( struct Data ));

注意除了这个免费电话

free(arr);

您还需要在循环中释放所有已分配的子数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。