1

URLを解析してコンポーネントに分割する関数を作成しました。URL のコンポーネントを格納するために、(関数への) ポインターを urlinfo という次の構造体に渡します。

typedef struct urlstruct {
    char** protocol;
    char** address;
    char** port;
    char** page;
} urlstruct;

二重ポインターが含まれている理由は、URL の各コンポーネントの長さが分からないためです。関数内で、各コンポーネントを格納するために必要なサイズを計算し、次の行を使用して urlstruct のコンポーネントにメモリを割り当てようとします。

*(urlinfo->protocol) = (char*)malloc(i * sizeof(char));

(i * sizeof(char))必要なサイズはどこですか。この行により、アクセス違反が発生します。メモリを正しく割り当てる方法を知っている人はいますか?

前もって感謝します :)

4

2 に答える 2

6

実際に C++ を使用していると仮定すると、代わりに次のようにする必要があります。

struct urlstruct {
    std::string protocol;
    std::string address;
    std::string port;
    std::string page;
};

次に、それを埋めるのは簡単です:

url.protocol = "http://";

そして、あなたは他に何も心配する必要はありません。

ただし、タグが間違っていて、何らかの理由で本当に cstrings が必要な場合:

typedef struct {
    char* protocol;
    char* address;
    char* port;
    char* page;
} urlstruct;

単一のポインターのみが必要です。次に、既存の方法と非常に近い方法でそれらにメモリを割り当てることができます。

char* proto = "http://" //Assuming you get this from somewhere
int len = strlen(proto) + 1;
urlstruct url;
url.protocol = malloc(len * sizeof(char));
于 2012-07-21T11:37:00.057 に答える
1

ポインターへのポインターは必要ありません。次のように構造を宣言します。

typedef struct urlstruct {
    char* protocol;
    char* address;
    char* port;
    char* page;
} urlstruct;

次に、次のように割り当てます。

urlinfo->protocol = (char*)malloc((i+1) * sizeof(char));

ポインターへのポインターは不要な複雑さであり、2 つのアイテムを割り当てる必要があることを意味します。これらの割り当ての 1 つをスキップしているため、アクセス違反が発生しています。

于 2012-07-21T11:37:06.760 に答える