c++ - 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++ 中,数组仅存在于堆栈上(动态分配的数组只是一个内存盒,大小为 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)所以它可以工作
推荐阅读
- javascript - Grafana 插件 - 在渲染之间清除输出
- laravel - 如何使用 laravel 对 mongodb 中的特定值进行分组,并且需要从集合中获取所有值
- android - TWA APP 中的 JS 错误:使用 Geolocation API 时出现“NoTwaFound”
- deployment - WFLYCTL0184:新的缺少/不满足的依赖项:(缺少)依赖项:[服务 jboss.deployment.unit。”
我在其中配置了 Jenkins master(server1) 和 agent(server2) 用于构建分发。我为 JAVA springboot 应用程序构建和部署创建了一个管道,而在 server1 中创建的战争能够在 JBOSS EAP 7.0 中部署,但
- c - 为泛型代码提供的复制函数返回的类型可以是我们想要的任何类型吗?
- node.js - 使用 NodeJS 和 Express 进行 MongoDB GridFS 内容搜索
- javascript - 通过滚动正文隐藏 ios Safari 导航栏是唯一的方法吗?
- laravel - 如何在控制器返回时触发通知?
- c++ - 在套接字中,为什么我必须在 connect() 中使用 sizeof(addr) 而不是在 accept() 中使用 (socklen_t)&addr?
- mysql - 如何使用 MySQL 为每个客户输出 3 个最高销售额?