如何使用指针确定C中的sizeof数组?

时间:2017-01-11 13:16:38

标签: c arrays pointers

我有一个数组,其中包含指向其他数组的指针。我想打印所有值,但我无法获得特定数组的sizeof。我做错了什么?

 private void downloadImage()
{
    RealmResults<ARDatabase> results = mRealm.where(ARDatabase.class).findAll();

    for(ARDatabase x:results)
    {
        if(!x.getIsDownloaded())
        {
            mdataCollection.add(new DownLoadList(x.getUrlImg(),x.getUid()));
        }
    }

    for(DownLoadList i:mdataCollection)
    {
        Log.e("Link",""+i.getImageUrl());
        Picasso.with(getApplicationContext()).load(i.getImageUrl()).into(target);
    }
}

 private Target target = new Target() {
    @Override
    public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from)
    {
        Log.e("PICASSO","SUCCESSFUL");


        new Thread(new Runnable() {
            @Override
            public void run() {

                File sd = getExternalCacheDir();
                File folder = new File(sd, "/arproject/");
                if (!folder.exists()) {
                    if (!folder.mkdir()) {
                        Log.e("ERROR", "Cannot create a directory!");
                    } else {
                        folder.mkdirs();
                    }
                }

                //File[] fileName = {new File(folder, "one.jpg"), new File(folder, "two.jpg")};


                for (DownLoadList i:mdataCollection)
                {
                    File fileName = new File(folder,i.getUid().toLowerCase()+".jpg");


                    if (!fileName.exists()) {
                        try {
                            fileName.createNewFile();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    else
                    {

                        try {
                            FileOutputStream outputStream = new FileOutputStream(String.valueOf(fileName));
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
                            outputStream.close();

                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }


                }


            }
        }).start();

    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable)
    {
        Log.e("PICASSO","FAILED"+errorDrawable.toString());

    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {

    }
};

3 个答案:

答案 0 :(得分:7)

你不能。一旦数组衰减到指针,您就不再拥有有关数组大小的信息。你需要以其他方式跟踪它。

在显示代码的情况下,您可以拥有第二个数组TAB_SIZES,其中包含TAB中指向的数组的大小。

还要记住,对于任何数组或指针p和索引i,表达式p[i]等于*(p + i)。这意味着你不必做*(TAB[i]+j)。而是TAB[i][j],感觉更自然&#34;对大多数人来说。

答案 1 :(得分:1)

当在数组上使用时,sizeof返回该数组中元素的数量乘以每个数组的大小,如下所示。

int a[10];
sizeof(a); /* returns (sizeof(int) * 10) */

有关此代码的示例,请参阅here

但是,当您将T1,T2,T3,T4和T5指定为TAB的元素时,它们将转换为float *,并且TAB中不存在它们作为数组的信息。因此,当使用参数TAB [i]调用sizeof时,它只被解释为指向float的指针,并返回sizeof(float *)。

答案 2 :(得分:0)

你必须自己跟踪它。在GCC中,支持以下扩展:

struct sized_array {
  int size;
  float array[0];
}

它被称为零长度数组。以及你如何分配内存:

int target_size = 100;
struct sized_array *the_array = malloc(sizeof(struct sized_array) + target_size * sizeof(float));
the_array->size = target_size;

the_array自动包含一个带有(至少)100个浮点槽的数组。更多详细信息,请参阅info gcc,6.17。

相关问题