promotion image of download ymail app
Promoted
士善 發問時間: 電腦與網際網路程式設計 · 1 0 年前

c++程式問題Access violation

下面是我的程式... 但執行後會出現

Unhandled exception at 0x00411594 in HomeWork.exe: 0xC0000005: Access violation writing location 0xcccccccc.

請問是哪裡有問題呢?

#include "stdafx.h"

#include <iostream>

using namespace std;

struct Song

{

int id;

char name[100];

char singer[20];

};

int main()

{

struct Song **q;

Song *p;

q = &p;

//q = new (Song *);

*q = new Song;

q[0]->id = 1;

strcpy(q[0]->name, "第一名曲");

strcpy(q[0]->singer, "第一歌手");

cout << q[0]->id << q[0]->name << q[0]->singer << endl;

q[1]->id = 2;

strcpy(q[1]->name, "第二名曲");

strcpy(q[1]->singer, "第二歌手");

system("PAUSE");

//delete[]q;

delete *q;

return 0;

}

Unhandled exception at 0x00411594 in HomeWork.exe: 0xC0000005: Access violation writing location 0xcccccccc.

4 個解答

評分
  • Inunu
    Lv 5
    1 0 年前
    最佳解答

    你的程序在

    *q = new Song;

    有給 q[0] 做配置. 此行相當於

    q[0] = new Song;

    所以後面 q[0] 的操作一切正常.

    但你並未給 q[1] 做任合配置, 甚至沒有設定 q[1] 到底指向何處. 因此當你讀寫 q[1] 所指的內容時馬上出現問題.

    q[1]->id = 2; // <--- 這裡出現 access violation

    如在這之前加上

    q[1] = new Song;

    可以暫時解決你的問題.

    當然在結束前也要釋放

    delete q[1];

    • Commenter avatar登入以對解答發表意見
  • attore
    Lv 4
    3 年前

    Access Violation Writing Location

    參考資料: https://shorte.im/bcfvb
    • Commenter avatar登入以對解答發表意見
  • 3 年前

    Access Violation Writing Location

    參考資料: https://shrink.im/ba6nl
    • Commenter avatar登入以對解答發表意見
  • Cloud
    Lv 4
    1 0 年前

    *q = new Song;

    你這一行宣告只new了一個Song的空間

    所以只能用[0]的位置

    使用到[1]的位置時就會發生記憶體存取錯誤

    你那些錯誤訊息也是告訴你記憶體有存取錯誤

    正確應該要*q=new Song[2];

    配置兩個空間給他

    才不會有記憶體存取錯誤的情況發生

    2007-11-06 18:53:39 補充:

    To Inunu:

    q的位址是p的

    q=&p;

    所以他並沒有q[1]的空間可以存取,這樣也會造成存取錯誤

    參考資料: 自己, 自己
    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。