[英]C++ Variable unexpectedly overwritten
我只是不明白。 我有兩個“主要變量” address
和parameters
。 address
是一個 const char, parameters
是一個正在填充信息的字符串(char 數組)。
現在很奇怪的事情(至少對我來說):在將時間戳添加到parameters
之后, address
被清除了!
有人知道為什么嗎?
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
void setOnlineStatus(char deviceName[30], bool deviceStatus, const char outputContent[50], int value, const char functionName[30], bool onlineRequestImmediately=true) {
const char address[128]= "https://api.arduino.myAddress.com";
char parameters[512] = "?secret=w2q3oifin23c&deviceName=";
cout << "Address: ";
cout << address << endl;
cout << "Parameters: ";
cout << parameters << endl;
strcat(parameters, deviceName);// +"&status="+deviceStatus+"&value="+value+"&time="+getTimestamp()+"&functionName="+functionName;
strcat(parameters, "&status=");
char tempDeviceStatus[1];
sprintf(tempDeviceStatus, "%d", deviceStatus);
strcat(parameters, tempDeviceStatus);
cout << "Address01: ";
cout << address << endl;
strcat(parameters, "&value=");
char tempValue[3];
sprintf(tempValue, "%d", (int) value);
strcat(parameters, tempValue);
cout << "Address02: ";
cout << address << endl;
strcat(parameters, "&functionName=");
strcat(parameters, functionName);
cout << "Address03: ";
cout << address << endl;
strcat(parameters, "&time=");
char tempTimestamp[10];
sprintf(tempTimestamp, "%d", 1234567890);
strcat(parameters, tempTimestamp); // this doesn't work neither: strcat(parameters, "1234567890");
cout << "Address04: ";
cout << address << endl; // output is empty!
strcat(parameters, "&message=");
strcat(parameters, outputContent);
cout << "Address05: ";
cout << address << endl; // output is empty!
cout << "Parameters: ";
cout << parameters << endl;
}
int main()
{
setOnlineStatus("testControl1", 1, "controlTurnedOff", 201, "toggleFans()");
}
那是 output:
Address: https://api.arduino.myAddress.com
Parameters: ?secret=w2q3oifin23c&deviceName=
Address01: https://api.arduino.myAddress.com
Address02: https://api.arduino.myAddress.com
Address03: https://api.arduino.myAddress.com
Address04:
Address05:
Parameters: ?secret=w2q3oifin23c&deviceName=testControl1&status=1&value=201&functionName=toggleFans()&time=1234567890&message=controlTurnedOff
這堆緩沖區和strcats之類的東西比它需要的要復雜得多
相反,您可以這樣做:
char parameters[512];
int result = snprintf(parameters, sizeof parameters,
"?secret=w2q3oifin23c"
"&deviceName=%s"
"&status=%d"
"&value=%d"
"&functionName=%s"
"&time=%d"
"&message=%s",
deviceName, (int)deviceStatus, value, functionName, 1234567890, outputContent);
if ( result < 0 || result >= sizeof parameters )
// ...handle error or overflow
在原始代碼中,您溢出了大小為 1 的tempDeviceStatus
,但您向其寫入了兩個字符(0 或 1 加上 null 終止符),並且您還溢出tempValue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.