函数如何返回一个大于它正在填充的char数组的cstring



我想首先解释一下,这只是一个好奇的问题,以帮助我更好地理解c++。

我正在使用C++中的cstring库从多个变量生成一个长cstring。我正在运行一个测试程序,看看我需要什么最大的char数组来保存cstring。为了做到这一点,我将buffer定义为一个全局变量,其大小我知道可以容纳cstring。生成后,我使用strlen找到最大长度,得出1517。然后,出于好奇,当它失败时会是什么样子,我将buffer的大小缩小到1000……它仍然有效。直到我将buffer减少到300,我才得到执行错误。

当我在main()函数中定义缓冲区时,当buffer小于输出时,我会得到错误,但它仍然打印完整的输出。我包括了我的工作示例,我使用gbufferbuffer作为缓冲区的全局版本和本地版本。

我的假设是,cstring被写入内存,strcat继续写入超过缓冲区或gbuffer定义时设置的界限,std::cout只是读取,直到它达到空字符,所以只要没有其他东西保留该空间或写入那里,程序仍然可以运行,尽管不能保证它会运行,因为它是在没有为它保留的内存中写入的。

#include <iostream>
#include <cstring>
//Global Variables
int Temperature=100;
int Heat=100;
int Cool=100;
char Status[100]="Nothing";
char Source[100]="Default";
char gbuffer[900];
struct schedulePoint {
uint8_t days = 12;
uint8_t heat = 65;
uint8_t cool = 85;
uint16_t start = 60*24;
uint16_t end = 60*24;
};
struct myData {
char myName[12] = "TestStat";
schedulePoint schedule[64];
char password[25];
char ssid[25] = "Wifi Thermostat";
bool hidden = false;
uint8_t defaultHeat = 65;
uint8_t defaultCool = 85;
int timezone = 0;
char serverUName[25] = "";
char serverPW[25] = "";
} data;

char * get_JSON(char * buff, unsigned int buffSize) {
std::cout << "Buffer Size:" << buffSize << "n";
char convert[500];
strcpy(convert,"<script>schedule=[");
strcpy(buff,convert);
for (uint8_t z = 0; z < 64; z++) {
if (z == 0) strcat(buff, "[");
else strcat(buff, ",[");
sprintf(convert, "%d,%d,%d,%d,%d]", data.schedule[z].days, data.schedule[z].heat, data.schedule[z].cool, data.schedule[z].start, data.schedule[z].end);
strcat(buff, convert);
}
strcat(buff, "];n");
sprintf(convert, "SSID="%s";n",data.ssid);
strcat(buff, convert);;
strcat(buff, "states=["Off","Heating","Cooling"];n");
sprintf(convert, "stats={"Temperature":%d,"State":%s,"Heat":%d,"Cool":%d,"Source":"%s"};n</script>", Temperature, Status, Heat, Cool, Source);
strcat(buff, convert);
return buff;
}

int main(){
char buffer[1000];
std::cout << get_JSON(gbuffer,sizeof(gbuffer));
std::cout << "n";
std::cout << "Ouput Size:" << (unsigned)strlen(gbuffer);
std::cout << "n";
return 0;
}

我的假设是,cstring被写入内存,strcat继续写入超过缓冲区或gbuffer定义时设置的界限,std::cout只是读取,直到它达到null字符,所以只要没有其他东西保留该空间或在那里写入,程序仍然可以运行,尽管不能保证它会这样做,因为它正在为它保留的内存中写入

正确。

您的程序的行为是未定义的。

不要这样做。

最新更新