簡體   English   中英

分段錯誤(核心轉儲)

[英]segmentation fault ( core dumped )

我正在嘗試使用 UART 接收 9 個浮點數據,每個浮點數都以 XXX.XX 的形式發送。 所以我將收到 5*9 =45 條信息。

我試圖在 45 個字符的數組中接收數據,然后我可以用這個數組做我想做的事情,但是當我運行我的應用程序時,我得到了這個著名的錯誤:分段錯誤(核心轉儲

我的代碼是

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <errno.h>
#include <wiringSerial.h>
using namespace std;
int main (){
    int fd;
    float courant;
    float voltage;
    float activepower;
    float reactivepower;
    float apparentpower;
    float powerfactor;
    float frequency;
    float temperature;
    float indexIns;
    string courantC;
    string voltageC;
    string activepowerC;
    string reactivepowerC;
    string apparentpowerC;
    string powerfactorC;
    string frequencyC;
    string temperatureC;
    string indexinsC;

    char receivedData[45];
    int i=0;
    if ((fd = serialOpen("/dev/ttyS1",9600)) < 0)
    {
        fprintf(stderr,"Unable to open serial device %s\n",strerror(errno));
        return 1;
    }
    // Loop , getting and printing characters

    for (int j=0; j<45; j++)
    {
        i = serialGetchar(fd);
        receivedData[j] = char(i);

        if (j = 44) {
            j = 0;

            courantC = receivedData[0]+receivedData[1]+receivedData[2]+"." + receivedData[3]+receivedData[4];
            voltageC = receivedData[5]+receivedData[6]+receivedData[7]+"." + receivedData[8]+receivedData[9];
            activepowerC = receivedData[10]+receivedData[11]+receivedData[12]+"." + receivedData[13]+receivedData[14];
            reactivepowerC = receivedData[15]+receivedData[16]+receivedData[17]+"." + receivedData[18]+receivedData[19];
            apparentpowerC = receivedData[20]+receivedData[21]+receivedData[22]+"." + receivedData[23]+receivedData[24];
            powerfactorC = receivedData[25]+receivedData[26]+receivedData[27]+"." + receivedData[28]+receivedData[29];
            frequencyC = receivedData[30]+receivedData[31]+receivedData[32]+"." + receivedData[33]+receivedData[34];
            temperatureC = receivedData[35]+receivedData[36]+receivedData[37]+"." + receivedData[38]+receivedData[39];
            indexinsC = receivedData[40]+receivedData[41]+receivedData[42]+"." + receivedData[43]+receivedData[44];

           
        }
        printf("a=%c ", char(i));

        fflush(stdout);

用於編譯的命令

gcc receiveData.cpp -o receiveData -lwiringPi -lpthread -lstdc++

這一行:

courantC = receivedData[0]+receivedData[1]+receivedData[2]+"." + receivedData[3]+receivedData[4];

導致未定義行為 (UB) 並且可能是段錯誤的原因。 在這一行中,您有一個char數組,這里是"." , 有 2 個字符, '.' '\\0' 這個數組存儲在某處。 當您像這樣使用它時,它會衰減為指向數組開頭的指針。 其余的都是char ,在C中都是整數,它們相加后加到指向數組"."的指針上"." . 這個指針然后指向一些未知的內存區域,該區域由String類訪問以復制到courantC 但是訪問該區域會導致UB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM