【解決方法】子: "書き込み場所でアクセス競合が発生しました。"


こんにちは。 私は主に C++ を使用していましたが、C についてはあまり知りませんでした。最近 C 言語の質問に遭遇しましたが、本当に理解できませんでした。
質問では、書き込み場所でアクセス競合が発生していることが常にわかりました。

“parse.h”:

C
struct query_parameter {
	const char* name;
	const char* value;
};

C
#include "parse.h"
int
parse_query_string(char* url, struct query_parameter** out)
{
	int status=0;
	int n = 0;
	int v = 0;
	char temp[] = {""};
	int count = 0;
	for (int i = 0; i < strlen(url); i++) {
		printf("\n%c %s\n", url[i],temp);
		if (status == 0 && url[i] == '?') {
			status = 1;
			n = 1;
			if (i < strlen(url)-1 && url[i + 1] != '=') {
				(*out) = (struct query_parameter*)malloc(sizeof(struct query_parameter) * 100);
				count += 1;
			}
			else return -1;
			continue;
		}
		if (status == 0) continue;
		if (n == 1) {
			if (url[i] == '=') {
				n = 0;
				v = 1;
				(*out)[count - 1].name = temp; --Here is where the problem occurs
				memset(temp, 0, sizeof(temp));
				if (i < strlen(url)-1 && url[i + 1] == '&') return -1;
		        continue;
			}
			char tempc[2];
			tempc[0] = url[i];
			tempc[1] = '\0';
			strcat(temp, tempc);
		}
        if (v == 1) {
			if (url[i] == '&') {
				n = 1;
				v = 0;
				(*out)[count - 1].value = temp;
				memset(temp, 0, sizeof(temp));
				if (i < strlen(url)-1 && url[i + 1] != '=') {
					count += 1;
					/*(*out) = (struct query_parameter*)realloc(sizeof(struct query_parameter) * count);*/
				}
				else return -1;
				continue;
			}
			char tempc[2];
			tempc[0] = url[i];
			tempc[1] = '\0';
			strcat(temp, tempc);
		}

	}
	if (status == 0) return -1;
	if (n == 1) return -1;
	if (v == 1) {
		if (strlen(temp) == 0) return -1;
		(*out)[count - 1].value = temp;
	}
	return count;
}

主なプログラムは次のとおりです。

C
char url[]={"http://example.com/xxx?id=1234&data_type=article&user=john"};
struct query_parameter* params;
parse_query_string(url,& params);

何が問題なのかを教えていただければ大変助かります。

私が試したこと:

最初に (*out).name 用のメモリを作成します。
(*out).name=(char*) malloc(strlen(temp)+1)
まだ動かない

解決策 1

私たちにはわかりません。そのコード部分を単独で実行することはできません。最も可能性が高いのは、その関数の呼び出しが無効なポインターを渡しているということです。

それはあなた次第です。
幸いなことに、何が起こっているかを調べるのに役立つツール、デバッガーが利用可能です。 使用方法はコンパイラ システムによって異なりますが、IDE の名前と「デバッガ」を Google で検索すると、必要な情報が得られるはずです。

関数の最初の行にブレークポイントを設定し、デバッガーでコードを実行します。 次に、コードとデータを調べて、手動で何が起こるかを考えます。 次に、各行を 1 ステップずつ実行して、期待したことが実際に起こったかどうかを確認します。 そうでない場合は、問題が発生しているときなので、前に戻って (またはもう一度実行して詳しく調べて) 理由を調べることができます。

申し訳ありませんが、私たちはそれを行うことはできません。新しい (そして非常に便利な) スキルであるデバッグを学ぶ時期です。

コメント

タイトルとURLをコピーしました