首页 > 解决方案 > C++ passing array without giving size. Other function to calc array size

问题描述

I want to pass an array as a parameter. I want the other function to calculate the array size. So array size is not passed as a parameter. How do I do this?

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

void myFunction1(int tmpints[])
{
    int arraysize = *(&tmpints + 1) - tmpints;
    printf("In myFunction1....\n");
    printf("   size is :%d\n",arraysize);
    printf("   start is :%p\n",*(&tmpints + 1));
}

void myFunction2(int tmpints[],int* EndP)
{
    printf("In myFunction2....\n");
    printf("   size is :%d // correct\n",EndP-tmpints);
    printf("   start is :%p\n",*(&tmpints + 1));
}

int main()
{
    int tmpintarray[] = {4,3,2,9,8,7};
    printf("In main....\n");
    printf("   start is :%p\n",*(&tmpintarray + 1));
    printf("   size is :%d // correct\n",*(&tmpintarray + 1)-tmpintarray);
    myFunction1(tmpintarray);
    myFunction2(tmpintarray,*(&tmpintarray + 1));
}

results

In main:

start is :0x7ffc7e593a38
size is :6 // correct

In myFunction1:

size is :-529944200
start is :(nil)

In myFunction2:

size is :6 // correct
start is :0x7ffc7e593a40

标签: c++arraysparameters

解决方案


在 c++ 中,数组仅存在于堆栈上(动态分配的数组只是一个内存盒,大小为 x*SingleObjectSize 而不是数组)。

当您将数组开头的指针传递给另一个函数时(这是您传递它的唯一方法)它不再位于目标函数的堆栈上,因此 sizeof 无法通过查看堆栈来工作(实际上 sizeof 是预编译的东西在您编写的代码中将大小硬编码为 size_t )

你可能会问它是否硬编码并且是预编译的,那么为什么编译器在传递给另一个函数时不硬编码相同的值,答案很清楚 :: 一个函数可以从很多地方调用许多其他函数,并且每次它可以有各种大小的数组

解决方案是将大小与数组一起传递或使用像 std::vector 这样的现代类型,女巫将大小保存在 size_t 中并在传递时携带它(女巫使用更多内存)

为什么您的代码在函数:: 中不起作用,当您输入时,(&tmpintarray + 1)您正在获取数组的地址并添加 1 ,添加sizeof(tmpintarray)女巫是 24 因为它引用数组并且它具有堆栈中的数组大小

如果我们将 tmpintarray 的地址视为 A *(&tmpintarray + 1) 返回 {(char)A+24} 或 {(int)A+6} 那么你减去 A 得到 6,因为 A+6 是 6 个整数比A ,并 print f 成功打印它

但是当您在 myFunction1 中执行此操作时, tmpints 不再是一个数组并且没有 24 (0x18) 的大小,它是一个指向 int 并且大小为 4 的指针,因此当您添加 +1 时,您只需添加4bytes 到 tmpints 的地址所以 - 不会再给你 24

但是在 myFunction2 中,您传递的是由 24 添加的地址(witch 在 main 函数中计算,main 的 sizeof(tmpintarray) 为 24 而不是 4)所以它可以工作


推荐阅读