お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#26 2009-12-13 23:13:43

avidya
ゲスト

Re: C言語でのSegmentation fault

コード:

#include<stdio.h>
#include<time.h>

int main(void){
    char p[62] = {"012345678901234567890123456789ABCDEFABCDEFGHJKLMNPRSTUVWXYZ"};
    int  i,j;
    char w;

    srand((unsigned)time(NULL));
    for(j=59; j>1;j--){
        i = rand() % j;
        w = p[i];
        p[i] = p[j];
        p[j] = w;
    }
    printf("%s\n",p);
    return(0);
}

の実行結果は

コード:

$ ./test
6B9YUF0C6D3FGCW2750VLTDE1805496A7A4X2

となり、

コード:

#include<stdio.h>
#include<time.h>

int main(void){
    char p[62] = {"012345678901234567890123456789ABCDEFABCDEFGHJKLMNPRSTUVWXYZZ"};
    int  i,j;
    char w;

    srand((unsigned)time(NULL));
    for(j=59; j>1;j--){
        i = rand() % j;
        w = p[i];
        p[i] = p[j];
        p[j] = w;
    }
    printf("%s\n",p);
    return(0);
}

の実行結果は

コード:

$ ./test
RSEAN7U9D2MGZ0F9371LY34XAEV5K64T16880564JD3CW21F8250H97PZCBB

となりました。
違いは

コード:

    char p[62] = {"012345678901234567890123456789ABCDEFABCDEFGHJKLMNPRSTUVWXYZ"};
    char p[62] = {"012345678901234567890123456789ABCDEFABCDEFGHJKLMNPRSTUVWXYZZ"};

です。
 CPUアーキテクチャに最適化したコンパイルパラメータが必要なのかも。

# 昔の Intel系の石のコンパイラで苦労した制御畑の人ならわかるかも。

 

#27 2009-12-13 23:39:57

avidya
ゲスト

Re: C言語でのSegmentation fault

 ちょっと自分のバカさ加減にあきれました orz

コード:

for(j=59; j>1;j--){

 "59" だめじゃん orz
 "p[59]=='\0'" だからダメ。配列は 0 始まり。
 このコードでは文字列の最後の '\0' が移動する場合がある。使い方にもよるけど結果を表示するときに printf などの関数を使ったりすると、バイナリ・データを printf などに渡してしまって、Segmentation fault が出るケースもあるかも。

 

#28 2009-12-13 23:49:26

avidya
ゲスト

Re: C言語でのSegmentation fault

 もうすこし詳細に説明しますね。

コード:

#include<stdio.h>
#include<time.h>

int main(void){
    char p[62] = {"012345678901234567890123456789ABCDEFABCDEFGHJKLMNPRSTUVWXYZ"};
    int  i,j;
    char w;

    srand((unsigned)time(NULL));
    for(j=59; j>1;j--){
        i = rand() % j;
        w = p[i];
        p[i] = p[j];
        p[j] = w;
    }
    printf("%s\n",p);
    return(0);
}

 このコードの for ループの第 1 周目、j=59 の時に 文字列 p の終端のnullを上書きして壊してます。つまり文字列の終端を示すnullがループの最初にまず間違いなく壊れます。i=j=59というのは、このコードではあり得ないので間違いなく壊れます。
 根本原因はこの文字列終端破壊です。

 

#29 2009-12-14 02:44:48

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

i=j=59が欲しいなら

j=0; j<59;j++

i=x=59 - j
では?

オフライン

 

#30 2009-12-14 02:47:50

jkbys
管理者
登録日: 2006-10-05

Re: C言語でのSegmentation fault

管理者の小林です。

ソースコードを例示して解説することは、本フォーラムの主旨から外れているように思います。
本フォーラムはUbuntuについての話題を扱う場所です。話の流れから多少逸脱することは当然あるでしょうし、それは許容されるべきだと思います。しなしながら、Ubuntuと関係のない話題が続くのは問題です。これ以上続けられるならば個人間でのやりとり、もしくは他の適切な場所でお願いしたく思います。

もちろん、Ubuntuにおけるプログラミング環境についての議論は、本フォーラムで行って頂いて問題ありません。ただし、このトピックで続けるべきではないでしょう。

オフライン

 

#31 2009-12-14 02:56:50

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

う~ん、寝ぼけています。

i=j=59が欲しいなら

j=0; j<59;j++

i=x=59 - j
では?

配列の要素数に使うのでしたね。

i=j=59からカウントダウンする事が目的なら

j=0; j<59;j++

i=x=58 - j
では?

変数 x が58~0に59回、カウントダウンされます。

オフライン

 

#32 2009-12-14 19:08:52

Z80B
メンバ
登録日: 2009-02-09

Re: C言語でのSegmentation fault

avidyaさんのご指摘の点は、私のうっかりミスでした。
さっそく修正しましたが、結果は変わりませんでした。

このスレッドですが、ubuntuフォーラムではなくC言語フォーラムと化しているので、今回の件に関しては苦情などが寄せられる前に撤収しようかと考えています。
プログラム自体は目的通りに動き、次の入力待ちの表示前に「segmentation fault」が表示されるだけですし、ハードウェアが破壊される事も考えにくいと思われます。
ubuntuから離れた内容になってしまい、申し訳なく思っています。

オフライン

 

#33 2009-12-14 19:14:33

Z80B
メンバ
登録日: 2009-02-09

Re: C言語でのSegmentation fault

avidyaさんの指摘とは#24の事です。

オフライン

 

#34 2009-12-14 22:20:27

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

管理者からの#30の投稿に気がついたには昼でした、すみません。
私も同じ意見ですが、最後に。

具体的には、"0"~"9"の文字を3回で30文字、"A"~"F"の6文字、"A"~"Z"から"I"と"O"を除いた24文字の合計60文字をchar型配列変数に入れ、シャッフルしています。

"Q"も無いですよ。59文字。
あとfor文のカウンターを直接使うのも余り良はくない(p[j])

では失礼します。

オフライン

 

#35 2009-12-15 02:17:58

avidya
ゲスト

Re: C言語でのSegmentation fault

 フォーラム管理者の方にもう一度お願いしたいのですが、フォーラムの趣旨に反する#23からの私の返信を全て削除願えないでしょうか。また、私のアカウントの停止を再度お願いします。
 ・フォーラムの趣旨に反する書き込みが許容されると誤解される危険性がある。
 ・個人的な健康上の理由であるが、これらの書き込みを目にしてしまうのが、精神的に苦痛であり、実際に症状が悪化しつつある。
 個人的な理由も含まれ誠に恐縮ですが、お願いできないでしょうか。

 

#36 2009-12-15 23:13:13

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

この投稿は、不適切な内容、かつ不適切な意図に基づいて発言されたものであることが確認できたため、管理者が削除しました。

オフライン

 

#37 2009-12-15 23:22:15

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

この投稿は、不適切な内容、かつ不適切な意図に基づいて発言されたものであることが確認できたため、管理者が削除しました。

オフライン

 

#38 2009-12-16 00:18:15

hito
管理者
登録日: 2007-03-18

Re: C言語でのSegmentation fault

hir0 による投稿:

ゲストのavidyaさん、貴方が第一号の特別扱いですよ。

改革、おめでとうwwww :lol:
(心の中は :lol:)

hir0 による投稿:

違う!
(心の中は:mad:)
う~ん、Object PascalのLinux版の時も同じでしたね、、、タイプが違う?、、、発言しようよ。

こちら側も気分が悪い。(それほどれも無いが)

確認です。これらは何を意図された発言なのか、ご説明ください。
少なくとも説明頂けるまではアカウントに制限を加えた状態にさせて頂きます。制限は一時的な措置で、最終的な結論が出た時点でこの状態は解除します。

特に、
 ・この文脈においてふざけたと取られる発言が妥当なのか、熟慮した上での発言なのか。
は、どのような論理に基づくものなのか説明して頂く必要があると考えています。

オフライン

 

#39 2009-12-16 13:25:27

hir0
メンバ
登録日: 2008-09-28

Re: C言語でのSegmentation fault

これらは何を意図された発言なのか、ご説明ください。

精神的な苦痛と症状云々を公の場で公表している人を弄るとどうなるのか。
個人的な感情と興味、etc...  ある意味、意図は無く刹那的な発言。

少なくとも説明頂けるまではアカウントに制限を加えた状態にさせて頂きます。制限は一時的な措置で、最終的な結論が出た時点でこの状態は解除します。

何かが制限されている。と言うことですね。
その辺りの事はお任せします、この場を使わせて貰っている以上運営者側のルールにが全てですので。

特に、
 特に、
 ・この文脈においてふざけたと取られる発言が妥当なのか、熟慮した上での発言なのか。
は、どのような論理に基づくものなのか説明して頂く必要があると考えています。

う~ん。
熟考は間違いなくしていないはずですが、どの様な論理だったかは
「アル中ハイマー」の症状がでて思い出せません。

オフライン

 

#40 2009-12-17 00:59:24

hito
管理者
登録日: 2007-03-18

Re: C言語でのSegmentation fault

hir0 による投稿:

これらは何を意図された発言なのか、ご説明ください。

精神的な苦痛と症状云々を公の場で公表している人を弄るとどうなるのか。
個人的な感情と興味、etc...  ある意味、意図は無く刹那的な発言。

少なくとも説明頂けるまではアカウントに制限を加えた状態にさせて頂きます。制限は一時的な措置で、最終的な結論が出た時点でこの状態は解除します。

何かが制限されている。と言うことですね。
その辺りの事はお任せします、この場を使わせて貰っている以上運営者側のルールにが全てですので。

特に、
 特に、
 ・この文脈においてふざけたと取られる発言が妥当なのか、熟慮した上での発言なのか。
は、どのような論理に基づくものなのか説明して頂く必要があると考えています。

う~ん。
熟考は間違いなくしていないはずですが、どの様な論理だったかは
「アル中ハイマー」の症状がでて思い出せません。

上記に基づき、該当する発言は削除しました。
「個人的な感情と興味、etc...  ある意味、意図は無く刹那的な発言」なるものは、CoCを含めた多くのルールを無視した行動であると考えられます。以降、これに基づく同種の行為を行われた場合、無条件かつ警告なくアカウントを削除します。また、各発言に問題があるとみられた場合、通常よりも低い閾値で部分/全体の削除を行いますので、熟考して頂いた上で投稿して頂ければと思います。

オフライン

 

Board footer

Powered by FluxBB