c - 从 C 中的函数返回后数组元素发生变化

标签 c string pointers arm

我有一个在 ARM 架构上运行的简单 C 程序。我们有两个全局数组:

char RxB[400];
char GPS[150];

我有一个这样的函数,它搜索并找到 keytermChar 之间的子字符串。结果子字符串被定义为函数的参数:

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;
}

在我的 ma​​in.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: ma​​in.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/

相关文章:

python - 我应该使用哪个,为什么?有关系吗? SafeUnicode 还是 django.utils.safestring.mark_safe()?

python - 在 Python 中打印新行对齐的字符串

C 数组 = 比 memcpy() 更快的数组

C 链表 - 将指针写入文件

c - C 中是否有等效于数组的 indexOf?

c - 如何替换txt文件中的一行?

objective-c - 识别低频噪声中短促的高频声音(objc/c)

android - 如何用字符串定义游标值?

c - 我如何初始化指针类型结构元素

c - 使用指针创建连接字符串函数时出现段错误错误