C++在不给定大小的情况下传递数组.其他用于计算数组大小的函数



我想传递一个数组作为参数。我想要另一个函数来计算数组大小。因此,数组大小不会作为参数传递。我该怎么做?

#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 :%dn",arraysize);
printf("   start is :%pn",*(&tmpints + 1));
}
void myFunction2(int tmpints[],int* EndP)
{
printf("In myFunction2....n");
printf("   size is :%d // correctn",EndP-tmpints);
printf("   start is :%pn",*(&tmpints + 1));
}
int main()
{
int tmpintarray[] = {4,3,2,9,8,7};
printf("In main....n");
printf("   start is :%pn",*(&tmpintarray + 1));
printf("   size is :%d // correctn",*(&tmpintarray + 1)-tmpintarray);
myFunction1(tmpintarray);
myFunction2(tmpintarray,*(&tmpintarray + 1));
}

结果

main:中

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

myFunction1:中

size is :-529944200
start is :(nil)

myFunction2:中

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

使用std::vector使事情变得更清晰、更简单。

sizeof在处理衰减为指针的数组值时没有帮助:即使它指向数组的开头,对编译器来说,它也与指向该数组单个元素的指针相同。指针不会"记住"用于初始化它的数组的任何其他内容

因此,您必须将数组大小作为参数传递
(int)sizeof(tmpintarray)/sizeof(tmpintarray[0])

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

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

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

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

为什么您的代码在函数中不起作用:在主函数中,当你输入(&tmpintarray + 1)时,你得到的是arrray的地址,并加1,加上sizeof(tmpintarray)开关是24,因为它指的是数组,并且它在堆栈中有数组大小

如果我们将tmpintarray的地址视为A*(&tmpintarray+1(返回{(char(A+24}或{(int(A+6}然后你减去A,你得到6,因为A+6比A向前6个整数,然后打印f成功地打印出

但是当您在myFunction1中执行此操作时,tmpints不再是一个数组,大小也不为24(0x18(,它是一个指向int的指针,大小为4所以当你加+1时,你只会在tmpins的地址上加4个字节,所以-不会再给你24个了

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

最新更新