arrays - 当大小未知时,通过引用将 char 数组传递给函数
问题描述
我正在学习指针和字符数组,想知道您是否可以在这里帮助我找到最佳解决方案。我想避免使用 malloc,因此我选择通过引用将 char 数组传递给函数,其中值被填充。在我的 main.c
char saved_networks[100]; // create an array to save data
readFile123(SPIFFS, "/wifi.txt",saved_networks);
Serial.print("saved networks=");
Serial.println(saved_networks);
和功能:
void readFile123(fs::FS &fs, const char *path, char* return_data)
{
int n=0;
Serial.printf("Reading file: %s\n", path);
File file = fs.open(path);
if (!file || file.isDirectory())
{
Serial.println("Failed to open file for reading");
return;
}
Serial.print("Read from file: ");
while (file.available())
{
char c = file.read();
delayMicroseconds(100);
Serial.print(c);
//strcat(return_data, &c); //returns meditation error
return_data[n]=c;
n=n+1;
}
file.close();
}
在上面的程序中,我创建了一个大小为 100 的 char 数组并将其传递给函数。在函数内部,我读取我的 SPIFFS 文件系统中的数据,然后将在那里找到的任何字符串赋值给我的 char 数组。上面的代码有效,但是我有 3 个问题:
1.为什么我不能使用strcat(return_data, &c);
导致 cpu 崩溃并返回错误:
Stack smashing protect failure!
abort() was called at PC 0x40137793 on core 1
ELF file SHA256: 0000000000000000
2.为什么我不能将我的 char 数组声明如下:char* saved_networks;
。如果我这样做,我的微控制器将崩溃并返回错误:
Read from file: TGuru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled
3.解决这个问题的最佳方法是什么?由于我不知道从 SPIFFS 读取的数据的最大大小是多少,因此仅将其大小声明为 100 可能还不够。有没有办法动态声明它?我认为唯一的方法是使用 malloc?真的吗?
解决方案
strcat(return_data, &c)
是一个<string>
函数,因此它需要实际的字符串而不是 char 数组。
在您的示例中,您传递了一个 char 的地址,可以将其解释为大小为 1 的 char 数组。有什么区别?
好吧,字符串是空终止的 char 数组,这意味着它们的最后一个有效元素是 a'\0'
,这些str
函数将忽略该 char 之后的所有内容。char* saved_networks;
声明一个可以存储类型地址的变量char
,你还是要分配空间!然后该空间的地址将存储在saved_networks
.您可以在阅读之前尝试找出文件的大小。或者您可以逐步阅读它。由于您正在使用
C++
,您还可以使用std::string
编辑:当你传递一个数组的名称时,它已经是一个引用,所以我想说你已经正确地传递了它,只需要小心你不要超过分配的空间(在这种情况下为 100 个字符)。
为了更清楚,让我向您展示一些合成糖的示例:
char saved_networks[100];
saved_networks == &saved_networks[0]; // true
saved_networks[0] == *saved_networks; // true
saved_networks[50] == *(saved_networks + 50); // true
&saved_networks[50] == saved_networks + 50; // true
+50
取决于数组类型:在这种情况下,它意味着 50 个字节,因为每个字符都是 1 个字节。
编辑2:
"h"
实际上更类似于:
char const arr[2] = {'h', '\0'};
这意味着"
用于字符串和'
字符!这很重要,因为str
函数期望字符串以空值终止,否则将存在来自无限循环的无效内存访问。
我认为这就是您所缺少的,现在您将能够更好地理解我的第一点。
推荐阅读
- ios - 获取多个 AVAudioPlayerNodes 的播放进度/时间
- php - 使用什么内置异常来要求调用方法?
- pointers - 0xc00000005:访问冲突读取位置0x00000008
- php - 为什么我会收到警告:在 C:\xampp\htdocs\oop_ph\function.php 中遇到的非数字值?
- python - 脚本交互模式
- android - 将颤振的 CameraImage 转换为文件
- algorithm - 算法将三角形拟合到盒子中
- visual-studio - SSRS 报告 - 总和标题 - 不在组中
- python - matplotlib 的视网膜显示模式是什么?
- parsing - Verilog if else 结构