[解決済み] リンクリストとアドレスがずれている状態でのメンバーアクセス
2022-02-08 19:32:52
質問事項
そこで、私は leetcodeの問題点その2 (基本的に、リストで反転した2つの数字があり、それらを合計して反転したリストで答えも返す必要があります)。しかし、私はこの迷惑なエラーを取得し続けます: "ランタイムエラー:8バイトのアライメントを必要とする型 'struct ListNode' のミスアラインドアドレス0x0000000031内のメンバーアクセス". 私のマシンで実行すると、正常に動作し、期待通りの結果を得ることができます。私のコードです。
/*Definition of the list:
struct ListNode {
int val;
struct ListNode* next;
};*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* answer = malloc(sizeof(struct ListNode));
answer->next = NULL;
answer->val = 0;
int auxInt = 0;
struct ListNode* auxVar = answer;
while(l1 != NULL || l2 != NULL) {
if(!l1) {
auxInt = answer->val;
answer->val = (auxInt + l2->val) % 10;
if(((l2->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l2->val + auxInt) /10;
}
l2 = l2->next;
}
else if(!l2) {
auxInt = answer->val;
answer->val = (auxInt + l1->val) % 10;
if(((l1->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l1->val + auxInt) /10;
}
l1 = l1->next;
} else {
auxInt = answer->val;
answer->val = (l1->val + l2->val + auxInt) % 10;
if(((l1->val + l2->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l1->val + l2->val + auxInt) /10;
}
l1 = l1->next;
l2 = l2->next;
}
if(l1 == NULL && l2 == NULL)
break;
else
{
if(!answer->next)
answer->next = malloc(sizeof(struct ListNode));
answer = answer->next;
answer->next = NULL;
}
}
return auxVar;
}
この問題を引き起こしている原因について、何かお心当たりはありませんか?お時間をいただきありがとうございます。
編集:以下は、クラッシュの原因となった数値の検証可能な例です。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
/*typedef struct InvertedList {
int val;
struct InvertedList *next;
struct InvertedList *previous;
}Lista;*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* answer = malloc(sizeof(struct ListNode));
answer->next = NULL;
answer->val = 0;
int auxInt = 0;
struct ListNode* auxVar = answer;
while(l1 != NULL || l2 != NULL) {
if(!l1) {
auxInt = answer->val;
answer->val = (auxInt + l2->val) % 10;
if(((l2->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l2->val + auxInt) /10;
}
l2 = l2->next;
}
else if(!l2) {
auxInt = answer->val;
answer->val = (auxInt + l1->val) % 10;
if(((l1->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l1->val + auxInt) /10;
}
l1 = l1->next;
} else {
auxInt = answer->val;
answer->val = (l1->val + l2->val + auxInt) % 10;
if(((l1->val + l2->val + auxInt) / 10) != 0) {
answer->next = malloc(sizeof(struct ListNode));
answer->next->val = (l1->val + l2->val + auxInt) /10;
}
l1 = l1->next;
l2 = l2->next;
}
if(l1 == NULL && l2 == NULL)
break;
else
{
if(!answer->next)
answer->next = malloc(sizeof(struct ListNode));
answer = answer->next;
}
}
return auxVar;
}
void adicionaLista(struct ListNode* ptrLista, char *array, int size) {
struct ListNode *auxNode = ptrLista;
for(int i = 0; i < size; i++) {
ptrLista->val = array[i];
if(i + 1 != size) {
ptrLista->next = malloc(sizeof(struct ListNode));
ptrLista = ptrLista->next;
}
}
ptrLista = auxNode;
printf("\n");
}
void printAnswer(struct ListNode *ptrAnswer) {
for(; ptrAnswer != NULL; ptrAnswer = ptrAnswer->next)
printf("%d ", ptrAnswer->val);
}
int main()
{
struct ListNode *l1 = malloc(sizeof(struct ListNode));
struct ListNode *l2 = malloc(sizeof(struct ListNode));
char lista[9] = {4,5,2,2,9,3,8,9,2};
char lista2[9] = {0,7,6,1,6,5,0,6,7};
adicionaLista(l1, lista, 9);
adicionaLista(l2, lista2, 9);
struct ListNode *answer = addTwoNumbers(l1, l2);
printAnswer(answer);
return 0;
}
解決方法は?
主な問題点は
next
が設定されていないため、最後の要素で
NULL
.
二次的な問題とは...
- 空のリストを作らないこと、つまり無駄なノードが作られる事態を避けることが期待されます。
- コードに重複が多い。そのため、コードを変更することが困難になっています。
-
printf("\n");
は、データの追加関数に含めてはいけません。出力関数で使用されるべきである。
修正・縮小コード
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) {
struct ListNode anchor = { .next = NULL }, *curr = &anchor;
int carry = 0;
while(l1 != NULL || l2 != NULL || carry) {
int val1 = 0, val2 = 0;
if(l1) {
val1 = l1->val;
l1 = l1->next;
}
if(l2) {
val2 = l2->val;
l2 = l2->next;
}
int answer = val1 + val2 + carry;
carry = answer > 9;//val1 and val2 are one digit.
curr = curr->next = malloc(sizeof(struct ListNode));
curr->val = answer % 10;
curr->next = NULL;
}
return anchor.next;
}
struct ListNode *makeListFromChars(const char *array, int size) {
struct ListNode anchor = { .next = NULL }, *curr = &anchor;
for(int i = 0; i < size; i++) {
curr = curr->next = malloc(sizeof(struct ListNode));//Creating lists and adding data is a separate function.
curr->val = array[i];
curr->next = NULL;
}
return anchor.next;
}
void printList(struct ListNode *p) {
for(; p; p = p->next)
printf("%d ", p->val);
printf("\n");
}
int main(void){
char lista1[9] = {4,5,2,2,9,3,8,9,2};
char lista2[9] = {0,7,6,1,6,5,0,6,7};
struct ListNode *l1 = makeListFromChars(lista1, 9);
struct ListNode *l2 = makeListFromChars(lista2, 9);
printList(l1);
printList(l2);
struct ListNode *answer = addTwoNumbers(l1, l2);
printList(answer);
//freeList(l1);freeList(l2);freeList(answer);
return 0;
}
関連
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】C言語で入力が整数型かどうかチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】execvp: バッドアドレスエラー