我有一个在 ARM 架构上运行的简单 C 程序。我们有两个全局数组:
char RxB[400];
char GPS[150];
我有一个这样的函数,它搜索并找到 key
和 termChar
之间的子字符串。结果子字符串被定义为函数的参数:
SEARCH_STATUS findString_chr(char *src, char *key, int key_size, char termChar, char *dst, int desLen)
{
char *temp, *tempchar;
temp = strstr(src, key);
if (temp == NULL)
return STR_KEY_NOT_FOUND;
else
temp += key_size;
tempchar = strchr(temp, termChar);
if (!tempchar)
return STR_TERMINATOR_NOT_FOUND;
uint8_t siz = (uint8_t)(tempchar - temp);
if (siz > desLen)
return STR_OVERFLOW;
memcpy(dst, temp, siz);
dst[siz] = '\0';
return STR_FOUND;
}
在我的 main.c 中,我有一个像这样的简单代码:
do {
ST = findString_chr(RxB, key, strlen(key), '$', GPS, 150);
// Some delay here
// Some other codes
} while (some conditions);
请注意,RxB
值每 1 秒变化一次,因为它是从串行通信中获得的。
我的问题是,据我所知,在退出 findStringchr
函数后,不应更改 GPS
的值,因为没有人操纵它的元素。但是当我调试我的代码时,我发现 GPS
数组的值仍然在变化。
有人知道吗?
P.S: main.c 更多细节:
cnt = 0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
do {
ST = findString_chr(RxB, key, strlen(key), '$', GPS, 150);
findString_chrchr(GPS, 2, st, 2);
if ((st[0] == 'A') && (ST == STR_FOUND)) {
findString_chrchr(GPS, 3, lati, 10);
findString_chrchr(GPS, 5, longi, 11);
sendState = GPS_ACTIVE;
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,GPIO_PIN_RESET);
}
HAL_Delay(1000);
HAL_IWDG_Refresh(&hiwdg);
gpsCounter++;
if (gpsCounter > (TIMEOUT_GPS/1000)) {
sendState = GPS_TIMEOUT;
memcpy(lati, "1111.1111", 10);
memcpy(longi, "01111.1111", 11);
gpsCounter = 0;
}
} while ((sendState == GPS_VOID) && (cnt != 1));
findStringchrchr()
函数返回两个连续逗号之间的子字符串:
SEARCH_STATUS findString_chrchr(char *src, int commaNumber, char *dst, int desLen) {
char *temp = src, *end;
int cnt = 0;
while (1) {
temp = strchr(temp, ',') + 1;
if (!temp)
return STR_KEY_NOT_FOUND;
else {
cnt++;
if (cnt == commaNumber) {
end = strchr(temp, ',');
int D = (end - temp);
if (D >= desLen)
return STR_OVERFLOW;
if (D == 0)
dst[0] = '\0';
} else {
memcpy(dst, temp, D);
dst[D] = '\0';
}
break;
}
}
}
return STR_FOUND;
}
最佳答案
在函数中dst
参数对应的位置传入GPS
在函数中,你有:
memcpy(dst,temp,siz);
这肯定会在执行时修改数组 GPS
,因此您断言“不应更改 GPS 的值,因为没有人操纵其元素”完全错误。
关于c - 从 C 中的函数返回后数组元素发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54614113/