0
/* DECLARED FUNCTIONS */
char *DetectDevice(void);

int main(int argc, char *argv[])
{
    char *PathToDevice;
    PathToDevice = DetectDevice();

...

    if(close(fd) == -1)
    {
        printf("Error Closing Port");
    }else
    {
        printf("whihi!");
        free(PathToDevice);
    }

    return 0;
}

char *DetectDevice(void)
{   
    char *Usbs = malloc(1024);
    Usbs = "/dev/ttyUSB1";
    return Usbs;
}

エラー メッセージ: * glibc が検出されました * ./test: free(): 無効なポインター: 0xbec1b504

ところで...このプログラムはラズベリーパイでコンパイルされています!

4

5 に答える 5

5
char *DetectDevice(void)
{   
    char *Usbs = malloc(1024);
    Usbs = "/dev/ttyUSB1";
    return Usbs;
}

あなたにはあなたが返す文字列アドレスchar *DetectDevice(void)が割り当てられ ています。解放してみてください。mallocによって格納されたアドレスはステートメントによってオーバーライドされ、Usbsはこの定数文字列へのアドレスを持ちます。誤って解放しようとした動的に割り当てられていません! "/dev/ttyUSB1"UsbsUsbsUsbs = "/dev/ttyUSB1";
"/dev/ttyUSB1"

このようにしてください。

char *DetectDevice(void)
    {   
        char *Usbs = malloc(1024);
        strcpy(Usbs,"/dev/ttyUSB1");
        return Usbs;
    } 
于 2012-12-05T13:20:45.030 に答える
4

Usbs = "/dev/ttyUSB1";Usbs文字列リテラルを指すように変更されます。これは読み取り専用メモリに存在する可能性があり、解放できません。使用する

char *DetectDevice(void)
{   
    char *Usbs = malloc(1024);
    strcpy(Usbs, "/dev/ttyUSB1");
    return Usbs;
}

文字列をコピーする、または

char *DetectDevice(void)
{   
    return strdup("/dev/ttyUSB1");
}

代わりに、適切な量のメモリで文字列を割り当てます。

DetectDeviceまたは、読み取り専用の文字列を返すことも認識できます

const char *DetectDevice(void)
{   
    return "/dev/ttyUSB1";
}

free代わりに、呼び出し元のコードから を削除します。

于 2012-12-05T13:19:33.487 に答える
1

ここでは問題ではないかもしれませんがmalloc、特にラズベリーパイなどのリソースが限られているシステムでは、NULL ではなく有効なアドレスを実際に返すことを確認する必要があります。

すなわち

char *DetectDevice(void)
    {   
        char *Usbs = malloc(1024);
        if(Usbs != NULL)
        {
           strcpy(Usbs,"/dev/ttyUSB1");
        }
        else
        {
          // malloc didn't allocate memory do something about it.
        }
        return Usbs;
    } 
于 2012-12-05T14:47:41.593 に答える
1

freeor と一緒に来ますmallocorcallocまたはreallocそれは常にそのペアにあります.

mallocfree は、またはcallocまたはを使用して割り当てられたポインターにのみ適用できますrealloc

1024functionにメモリのブロックを割り当てたときDetectDevice。次の行では、ポインターを Stringliteral に割り当てています"/dev/ttyUSB1"

したがって、同じものが返され、ポインターによってポイントされ、PathToDeviceそれを解放しようとしているため、この種のエラーメッセージが表示されます。

を使用strcpy(Usbs,"/dev/ttyUSB1")してから返す必要がありますUsbs

そして、あなたは問題を抱えているだけでなく、抱えている問題freememory leakあります。コードから削除した後free(PathToDevice)も、エラーなしでメモリ リークが発生します。

(アドバイス: 最初にメモリをヒープに割り当ててから、ポインタが他のアドレスを指し始めるようなコードを作成することはお勧めできません。メモリ リークが発生します)。

于 2012-12-05T13:24:12.787 に答える
0

この帰属Usbs = "/dev/ttyUSB1"は、「右側の文字列の内容をUsbsが指すメモリに書き込む」ことを意味することを期待しているようです。

これはそれが意味することではありません。これは、「静的に割り当てられた定数文字列の場所を指すようにUSBを上書きする」ことを意味します。このような場所は、によって管理されmallocておらず、によって解放することもできませんfree

定数文字列の内容をにコピーするUsbsには、の機能を使用する必要がありますstring.h

于 2012-12-05T13:20:40.007 に答える