kesalahan terdeteksi glibc - id3Tag

Jadi, saya baru mengenal C dan saya mencoba menulis alat ini untuk mengedit tag id3 pada file musik dari baris perintah. Saya mendapatkan kesalahan ini:

* glibc terdeteksi bebas ganda atau rusak (atas): 0x0000000000502010 **

Dari apa yang saya baca, saya tahu ini ada hubungannya dengan mengosongkan memori. Tapi aku tidak begitu yakin ke mana harus pergi setelah ini. Bagaimanapun, logika saya adalah jika ada tag, saya akan membaca tag itu, lalu membuat perubahan apa pun yang perlu dilakukan dari bidang yang ditentukan di baris perintah. Inilah blok yang membuat saya kesulitan. Terima kasih atas wawasan apa pun sebelumnya!

    fopen(argv[1], "rb");
    fseek(in_file, -128, SEEK_END);
    fread(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

    for (x = 2; x < argc-1; x++)
    {            
        if (strcmp(argv[x], "-title"))
            strncpy(tagTest.title, argv[x+1], 30);
        if (strcmp(argv[x], "-artist"))
            strncpy(tagTest.artist, argv[x+1], 30);
        if (strcmp(argv[x], "-album"))
            strncpy(tagTest.album, argv[x+1], 30);
        if (strcmp(argv[x], "-year"))
            strncpy(tagTest.year, argv[x+1], 4);
        if (strcmp(argv[x], "-comment"))
            strncpy(tagTest.comment, argv[x+1], 28);
        if (strcmp(argv[x], "-track"))
            tagTest.track = atoi(argv[x+1]);
    }

    tagTest.seperator = 0;

    fopen(argv[1], "r+b");
    fseek(in_file, -128, SEEK_END);
    fwrite(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

person soflaz    schedule 05.02.2012    source sumber
comment
fread(&tagTest, sizeof(struct iD3Tag), 1, in_file); tidak boleh dilakukan. Struktur memiliki bantalan bagian dalam di antara anggota struktur karena batasan penyelarasan memori sehingga informasi tag Anda pada dasarnya akan rusak...   -  person    schedule 05.02.2012
comment
Apa definisi struct iD3Tag?   -  person pmg    schedule 05.02.2012


Jawaban (1)


Tidak ada free panggilan dalam kode ini, jadi saya kira Anda senang karena tidak membebaskan apa pun? Oleh karena itu, saya berasumsi Anda memiliki beberapa tumpukan korupsi di sini. Yaitu. Anda menulis lebih banyak data ke dalam tag daripada ruang yang ada.

Pertama, untuk menyampaikan maksud dari @H2CO3, saya rasa bukan itu masalahnya di sini. Mungkin saja masalah yang dia sebutkan memang ada - dalam hal ini Anda akan merusak file data Anda - namun sepertinya bukan itu penyebab kegagalan program.

Saya pikir masalah Anda yang sebenarnya adalah Anda tidak pernah menetapkan apa pun ke in_file! Saya rasa Anda memerlukan:

in_file = fopen (argv[1], "rb");

Beberapa komentar lainnya:

  • strcmp mengembalikan nol (salah) ketika sebuah string cocok dan bukan nol (benar) ketika tidak cocok ... jadi semua perbandingan Anda tampak rusak - itu seharusnya tidak menyebabkan kerusakan.
  • Perulangan muncul untuk memeriksa nilai argumen serta sakelar - Anda harus melewatinya.
  • Tidak perlu membuka file dua kali - Anda dapat membukanya untuk membaca dan menulis di awal.
  • Anda perlu melakukan lebih banyak pemeriksaan kesalahan jika file tidak ada atau tidak seperti yang Anda harapkan - tetapi saya yakin Anda mengetahuinya.
person ams    schedule 05.02.2012
comment
Terima kasih banyak! Saya bahkan tidak menyadarinya tentang strcmp atau fopen (Sebuah bukti betapa tidak berpengalamannya saya di C). Hanya pertanyaan lain, apa sebenarnya yang Anda maksud ketika Anda mengatakan bahwa loop memeriksa nilai argumen dan juga switch? Selain itu, saya membuat perubahan pada pernyataan if tetapi sekarang saya mendapatkan kesalahan segmentasi setiap kali saya menjalankan program pada file yang sama dua kali. Dan ketika saya melihat tag setelah saya mengeditnya pada program kedua yang dijalankan, itu tidak mencetak semuanya. - person soflaz; 06.02.2012
comment
Bayangkan Anda memiliki argumen -title foo -artist bar. Kode Anda pertama-tama memeriksa apakah -title adalah sebuah opsi; itu dilakukan dengan benar (atau akan terjadi jika Anda memiliki strcmp yang benar). Kemudian hal berikutnya yang dilakukannya adalah memeriksa apakah foo merupakan sebuah pilihan, tetapi ia seharusnya sudah menggunakannya. - person ams; 06.02.2012
comment
Oh. Saya mengerti sekarang. Terima kasih lagi. Akhirnya semuanya berjalan sebagaimana mestinya haha - person soflaz; 07.02.2012