glibc ตรวจพบข้อผิดพลาด - id3Tag

ฉันยังใหม่กับ C และฉันพยายามเขียนเครื่องมือนี้เพื่อแก้ไขแท็ก id3 ในไฟล์เพลงจากบรรทัดคำสั่ง ฉันได้รับข้อผิดพลาดนี้:

* glibc ตรวจพบ ไม่มีสองเท่าหรือเสียหาย (ด้านบน): 0x0000000000502010 **

จากสิ่งที่ฉันได้อ่าน ฉันรู้ว่ามันเกี่ยวข้องกับการทำให้หน่วยความจำว่าง ฉันแค่ไม่แน่ใจจริงๆว่าจะไปจากที่นี่ที่ไหน อย่างไรก็ตาม ตรรกะของฉันคือ ถ้ามีแท็กอยู่ ฉันจะอ่านแท็กนั้น จากนั้นทำการเปลี่ยนแปลงใดๆ ก็ตามที่จำเป็นต้องทำจากฟิลด์ที่ระบุในบรรทัดคำสั่ง นี่คือบล็อกที่ทำให้ฉันเดือดร้อน ขอบคุณสำหรับข้อมูลเชิงลึกล่วงหน้า!

    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 แหล่งที่มา
comment
fread(&tagTest, sizeof(struct iD3Tag), 1, in_file); เป็นไปไม่ได้ โครงสร้างมีช่องว่างภายในระหว่างสมาชิกโครงสร้างเนื่องจากข้อจำกัดในการจัดตำแหน่งหน่วยความจำ ดังนั้นข้อมูลแท็กของคุณจะเสียหายเป็นหลัก...   -  person    schedule 05.02.2012
comment
คำจำกัดความของ struct iD3Tag คืออะไร?   -  person pmg    schedule 05.02.2012


คำตอบ (1)


ไม่มีการเรียก free ในโค้ดนี้ ดังนั้นฉันคิดว่าคุณคงดีใจที่ไม่ได้ปล่อยอะไรซ้ำซ้อนใช่ไหม ดังนั้นฉันคิดว่าคุณมีความเสียหายแบบฮีปที่นี่ เช่น. คุณกำลังเขียนข้อมูลลงในแท็กมากกว่าที่ว่าง

ก่อนอื่นเพื่อพูดถึงประเด็นจาก @ H2CO3 ฉันไม่เชื่อว่านั่นคือปัญหาที่นี่ อาจเป็นไปได้ว่ามีปัญหาที่เขากล่าวถึงอยู่ ซึ่งในกรณีนี้คุณจะทำให้ไฟล์ข้อมูลของคุณเสียหาย แต่ดูเหมือนว่าจะไม่ใช่สาเหตุของความล้มเหลวของโปรแกรม

ฉันคิดว่าปัญหาที่แท้จริงของคุณคือคุณไม่เคยมอบหมายอะไรให้ in_file! ฉันคิดว่าคุณต้องการ:

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

ความคิดเห็นอื่นๆ:

  • strcmp ส่งคืนค่าศูนย์ (เท็จ) เมื่อสตริงตรงกัน และไม่เป็นศูนย์ (จริง) เมื่อ ไม่ ตรงกัน ... ดังนั้นการเปรียบเทียบทั้งหมดของคุณจึงดูเสียหาย - ซึ่งไม่ควรทำให้เกิดความเสียหาย
  • ลูปดูเหมือนจะตรวจสอบค่าอาร์กิวเมนต์และสวิตช์ - คุณควรข้ามสิ่งเหล่านั้น
  • ไม่จำเป็นต้องเปิดไฟล์สองครั้ง คุณสามารถเปิดทั้งอ่านและเขียนตั้งแต่เริ่มต้นได้
  • คุณต้องทำการตรวจสอบข้อผิดพลาดให้มากขึ้นในกรณีที่ไฟล์ไม่มีอยู่หรือไม่เป็นอย่างที่คุณคาดหวัง แต่ฉันแน่ใจว่าคุณรู้แล้ว
person ams    schedule 05.02.2012
comment
ขอบคุณมาก! ฉันไม่รู้ด้วยซ้ำว่าประมาณ strcmp หรือ fopen (ข้อพิสูจน์ว่าฉันไม่มีประสบการณ์ที่ C) อีกคำถามหนึ่ง คุณหมายถึงอะไรกันแน่เมื่อคุณบอกว่าลูปตรวจสอบค่าอาร์กิวเมนต์และสวิตช์ นอกจากนี้ ฉันได้ทำการเปลี่ยนแปลงคำสั่ง if แต่ตอนนี้ฉันได้รับข้อผิดพลาดในการแบ่งส่วนทุกครั้งที่ฉันรันโปรแกรมในไฟล์เดียวกันสองครั้ง และเมื่อฉันเข้าไปดูแท็กหลังจากที่ฉันแก้ไขมันในการรันโปรแกรมที่สองแล้ว มันก็ไม่ได้พิมพ์ทั้งหมด - person soflaz; 06.02.2012
comment
ลองนึกภาพคุณมีข้อโต้แย้ง -title foo -artist bar ก่อนอื่นโค้ดของคุณจะตรวจสอบเพื่อดูว่า -title เป็นตัวเลือกหรือไม่ มันทำสิ่งที่ถูกต้อง (หรือถ้าคุณมี strcmp ถูกต้อง) จากนั้นสิ่งต่อไปที่มันทำคือตรวจสอบว่า foo เป็นตัวเลือกหรือไม่ แต่มันควรจะใช้มันไปแล้วจริงๆ - person ams; 06.02.2012
comment
โอ้. ฉันเข้าใจแล้ว. ขอขอบคุณอีกครั้ง. ฉันได้ทุกอย่างทำงานในแบบที่ควรจะเป็นในที่สุดฮ่าฮ่า - person soflaz; 07.02.2012