C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
前スレ
C言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 143
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん (ワッチョイ b375-rVGZ)
2017/10/27(金) 21:28:08.20ID:pAogLeJi0872デフォルトの名無しさん (ササクッテロル Spc7-e1v7)
2017/12/15(金) 20:57:06.91ID:wYljbLzIp バスエラーってのは、あらかじめ決めた領域以外をアクセスしょうとしたら発生するのであって、読んだ後にここ読めないからなんて動作はしない。
むしろ決めて無い場合は幾らでも読み書き出来てしまう。例えそれが嘘でも虚構でもな。
後からノーカンなんてならない。
むしろ決めて無い場合は幾らでも読み書き出来てしまう。例えそれが嘘でも虚構でもな。
後からノーカンなんてならない。
874デフォルトの名無しさん (ワンミングク MM42-VKfU)
2017/12/15(金) 21:09:21.93ID:Hv9P7iJ4M875デフォルトの名無しさん (ササクッテロル Spc7-e1v7)
2017/12/15(金) 21:13:59.01ID:wYljbLzIp >>874
それは命令アドレスのLSB見りゃ即出せる罠
それは命令アドレスのLSB見りゃ即出せる罠
876デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
2017/12/15(金) 21:26:18.69ID:yuhdgz4g0877デフォルトの名無しさん (ドコグロ MM97-jdna)
2017/12/15(金) 21:34:47.34ID:FCwL/bM6M >>876
お前がわかってないだけだろ w
68K の話ならデータが読めると言うのは DTACK のアサートで示される
その後に BERR をアサートしても受け付けなかったと思う
(そんなアホな設計はしたことないから本当にそうかどうかは試してないけど)
そもそも BERR は非同期じゃないからお前が初めから頓珍漢なだけ
お前がわかってないだけだろ w
68K の話ならデータが読めると言うのは DTACK のアサートで示される
その後に BERR をアサートしても受け付けなかったと思う
(そんなアホな設計はしたことないから本当にそうかどうかは試してないけど)
そもそも BERR は非同期じゃないからお前が初めから頓珍漢なだけ
878デフォルトの名無しさん (ドコグロ MM97-jdna)
2017/12/15(金) 21:39:55.86ID:FCwL/bM6M >>874
68000 の時代はデータでもダメだったけど今時はプロセッサ側で何とかするアーキも多いと思う
68000 の時代はデータでもダメだったけど今時はプロセッサ側で何とかするアーキも多いと思う
879デフォルトの名無しさん (ササクッテロル Spc7-e1v7)
2017/12/15(金) 21:45:50.28ID:wYljbLzIp intelの石はワードやロングワードのアクセスでも奇数アドレスからだろうとマシン側で何とかしてくれるから生き残ってるんだと思うわ
880デフォルトの名無しさん (ワッチョイ 4771-exlo)
2017/12/15(金) 21:49:45.98ID:6FXlP8Zr0 プログラミング歴1年になったけどみんなの言ってることがわからなさすぎて辛い
アセンブリもやった方がいいんか?
アセンブリもやった方がいいんか?
881デフォルトの名無しさん (ワッチョイ ffb3-AOQJ)
2017/12/15(金) 21:50:45.81ID:M+B7lc8R0 必要になったらやればいい
882デフォルトの名無しさん (ドコグロ MM97-jdna)
2017/12/15(金) 22:02:36.15ID:FCwL/bM6M >>879
普通に組んでてあまりありがたみを感じたことはないけど...
普通に組んでてあまりありがたみを感じたことはないけど...
883デフォルトの名無しさん (ワッチョイ eb55-ngMC)
2017/12/15(金) 22:15:07.19ID:esYes5hp0884デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/15(金) 22:47:47.28ID:QRFEcBGB0 >>852
ゆとりマジで死ね
韓国人も死ね
お前らはそういう所がいけない。俺は逆ギレしているのではなく、単にキレてるだけだ。
お前らはそうやって常に話をすり替え、被害者ポジションを確保する癖があるが、それは根本的に間違ってる。
そもそも、ここにはお前らより知識のある奴が沢山居るんだから、お前らの聞きかじりで回答する必要はない。
話が余計におかしくなってるだろ。
話を>>841に対する回答に戻すと、841の話しぶりからして、
俺は以下を補足した方がいいと思ったから>>843を投稿したんだよ。
1. 841の言う「ヌルポ」はOSがMMUで捕まえるヌルポである。
2. >>838の言う「組み込み」はMMUがない場合を指している。
3. 838の言う「ゼロ番地付近をアクセス」はOS+MMUがない場合を想定している。
4. 従って838のケースでは841の想定するヌルポは発生しない。
というのを伝えるために書いたんだ。
それをお前は知ったかをしたくて、「MMUなら俺も知ってる!」と勝手に食いついてきただけ。
読む限り、お前は例外がどう動くのか理解できてないと分かるが、無知なままでいろ。
俺は841を助けようとしたのであって、韓国人とゆとりは死ねとしか思ってないから。
VBRを変更する場合、確かに0番地付近を構造体アクセスして転記するんだよ。
838はこれに気づいた、そしてそれを伝えた。
俺は841が「0番地アクセス=ヌルポ」と思っているっぽいので、(これは通常のOS+MMUならそうだが)
それとは違うぞと分かるように補足した。
それに知ったかゆとりが食いついてきただけ。
> プログラミング初心者です (>>835)
という点からしても、838で当たりだろう。
VBRを変更するならかなり初期で対応するので、初心者でも目に付く場所に記述される。
ゆとりマジで死ね
韓国人も死ね
お前らはそういう所がいけない。俺は逆ギレしているのではなく、単にキレてるだけだ。
お前らはそうやって常に話をすり替え、被害者ポジションを確保する癖があるが、それは根本的に間違ってる。
そもそも、ここにはお前らより知識のある奴が沢山居るんだから、お前らの聞きかじりで回答する必要はない。
話が余計におかしくなってるだろ。
話を>>841に対する回答に戻すと、841の話しぶりからして、
俺は以下を補足した方がいいと思ったから>>843を投稿したんだよ。
1. 841の言う「ヌルポ」はOSがMMUで捕まえるヌルポである。
2. >>838の言う「組み込み」はMMUがない場合を指している。
3. 838の言う「ゼロ番地付近をアクセス」はOS+MMUがない場合を想定している。
4. 従って838のケースでは841の想定するヌルポは発生しない。
というのを伝えるために書いたんだ。
それをお前は知ったかをしたくて、「MMUなら俺も知ってる!」と勝手に食いついてきただけ。
読む限り、お前は例外がどう動くのか理解できてないと分かるが、無知なままでいろ。
俺は841を助けようとしたのであって、韓国人とゆとりは死ねとしか思ってないから。
VBRを変更する場合、確かに0番地付近を構造体アクセスして転記するんだよ。
838はこれに気づいた、そしてそれを伝えた。
俺は841が「0番地アクセス=ヌルポ」と思っているっぽいので、(これは通常のOS+MMUならそうだが)
それとは違うぞと分かるように補足した。
それに知ったかゆとりが食いついてきただけ。
> プログラミング初心者です (>>835)
という点からしても、838で当たりだろう。
VBRを変更するならかなり初期で対応するので、初心者でも目に付く場所に記述される。
885デフォルトの名無しさん (ワッチョイ ef9f-v37J)
2017/12/15(金) 23:13:36.36ID:i/+5VHc30 >>835
それをコンパイルするコンパイラの仕様とそれを実行するマシンアーキテクチャによって変わる。
それをコンパイルするコンパイラの仕様とそれを実行するマシンアーキテクチャによって変わる。
886デフォルトの名無しさん (ワッチョイ ef9f-v37J)
2017/12/15(金) 23:15:47.32ID:i/+5VHc30 OSによっても変わるかな。
まあしかしOSそのもののソースコードならそう書いて正常動作したとしても特におかしくないかな。
まあしかしOSそのもののソースコードならそう書いて正常動作したとしても特におかしくないかな。
887デフォルトの名無しさん (ワッチョイ 1287-e1v7)
2017/12/15(金) 23:17:08.62ID:BFk+79HN0888デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/16(土) 00:41:25.75ID:wOa8xeUW0 >>884
頓珍漢な長文はチラ裏にでも書いとけよ
頓珍漢な長文はチラ裏にでも書いとけよ
889デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/16(土) 00:43:03.04ID:wOa8xeUW0 >>887
いや、普通アライメントは合わせるだろ
いや、普通アライメントは合わせるだろ
890デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 01:00:53.64ID:TBmZZU6f0891デフォルトの名無しさん (ワッチョイ 1ee9-gSDb)
2017/12/16(土) 01:04:56.11ID:fQ+nYBte0 はあゆとり死ねとかマヂ意味わからんι……
892デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 01:20:01.62ID:TBmZZU6f0893デフォルトの名無しさん (ワッチョイ 1ee9-gSDb)
2017/12/16(土) 01:26:49.17ID:fQ+nYBte0 過去レスまでちゃんと読んで欲しいならコテ付けること☆
894デフォルトの名無しさん (ワッチョイ 4771-exlo)
2017/12/16(土) 01:30:20.56ID:Ln4R8YhZ0 「韓国人」はこのスレだとNG推奨だゾ
895デフォルトの名無しさん (ワッチョイ 926e-zS+j)
2017/12/16(土) 05:42:42.76ID:V7dZrSJp0 1点、気になるのがNULLと書いていたことだ
0番地にアクセスすることを意図しているコードは
struct hoge *tmp = NULL; ではなく
struct hoge *tmp = (struct hoge *)0; と書くだろう
思うに、単にtmpへの代入を忘れただけではないか?
そういうポカミスを多発するどんくさいやつほど
「変数は必ず初期化」に固執する
0番地にアクセスすることを意図しているコードは
struct hoge *tmp = NULL; ではなく
struct hoge *tmp = (struct hoge *)0; と書くだろう
思うに、単にtmpへの代入を忘れただけではないか?
そういうポカミスを多発するどんくさいやつほど
「変数は必ず初期化」に固執する
896デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/16(土) 07:59:04.78ID:wOa8xeUW0 >>894
まあ、ゆとりとか韓国人とか言い出す時点でお察しって奴やね w
まあ、ゆとりとか韓国人とか言い出す時点でお察しって奴やね w
897デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 08:59:26.34ID:TBmZZU6f0898デフォルトの名無しさん (ドコグロ MM97-jdna)
2017/12/16(土) 09:48:05.22ID:KXDpqAfSM MMU とか VBR とか知ってる言葉を必死に使ってるって感じが出てて微笑ましいな
899デフォルトの名無しさん (ワッチョイ 92e3-4pIx)
2017/12/16(土) 09:51:57.71ID:ocr1ZUEA0900デフォルトの名無しさん (ワッチョイ b2f9-M+37)
2017/12/16(土) 10:12:43.78ID:qv7q395J0 C言語に関する話題で意味のある文脈で韓国人なりゆとりなりが出てくることはまず無いだろうから、NGしとけばいいな。
901デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 12:02:39.06ID:TBmZZU6f0902デフォルトの名無しさん (エムゾネ FF32-JSy5)
2017/12/16(土) 13:04:37.50ID:MrWvRMOoF >>901
後ろ二行は同意
後ろ二行は同意
903デフォルトの名無しさん (ドコグロ MM97-jdna)
2017/12/16(土) 13:11:58.97ID:KXDpqAfSM > その程度の用語で威張れると思える時点で終わってる
>>884に言ってやれよ w
>>884に言ってやれよ w
904デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 13:34:31.45ID:TBmZZU6f0 >>903
ガチアスペか?
韓国人か?
それじゃ論理が通らんだろ
ID:KXDpqAfSM = ID:FCwL/bM6M = ID:wOa8xeUW0 = ID:tW10X6gZ0 = ID:JlwKPeYd0
お前だけがぶっちぎりの馬鹿だな
韓国人死ね
ガチアスペか?
韓国人か?
それじゃ論理が通らんだろ
ID:KXDpqAfSM = ID:FCwL/bM6M = ID:wOa8xeUW0 = ID:tW10X6gZ0 = ID:JlwKPeYd0
お前だけがぶっちぎりの馬鹿だな
韓国人死ね
905デフォルトの名無しさん (ワッチョイ cb8a-QofM)
2017/12/16(土) 13:41:28.81ID:J4pjF+US0 NULLが(void *)0になったのっていつからだっけ
C89には無かったよね?
C89には無かったよね?
906片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/16(土) 13:42:01.01ID:2NfYNG63d おっぱいおっぱいぽよんぽよん
おっぱいおっぱいぽよんぽよん
仲良くしようぜ
おっぱいおっぱいぽよんぽよん
仲良くしようぜ
907片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/16(土) 13:45:48.99ID:2NfYNG63d908デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
2017/12/16(土) 14:30:30.83ID:+Cq6iaDY0 >>906
つまりこうであると。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
fputs("おっぱい", stdout);
for (j = 0; j < 2; j++)
fputs("ぽよん", stdout);
putchar('\n');
}
return 0;
}
つまりこうであると。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
fputs("おっぱい", stdout);
for (j = 0; j < 2; j++)
fputs("ぽよん", stdout);
putchar('\n');
}
return 0;
}
909デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
2017/12/16(土) 14:32:07.96ID:+Cq6iaDY0 そういや古いソースには char *p なのに if (*p == NULL) みたいに書いてあるのがあって、今時のコンパイラだと警告出しまくりになるんだよなあ。
910片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/16(土) 15:55:35.27ID:2NfYNG63d >>908
こう書いてもいいね。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
if (i % 4 < 2) fputs("おっぱい", stdout);
else fputs("ぽよん", stdout);
if (i % 4 == 3) putchar('\n');
}
return 0;
}
こう書いてもいいね。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
if (i % 4 < 2) fputs("おっぱい", stdout);
else fputs("ぽよん", stdout);
if (i % 4 == 3) putchar('\n');
}
return 0;
}
911デフォルトの名無しさん (ワッチョイ 1287-e1v7)
2017/12/16(土) 16:43:18.46ID:CGnB4g3o0 NULLの値が、0xDEADC0DEになってる環境なら知ってる。
912デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/16(土) 17:20:00.24ID:wOa8xeUW0 >>904
頓珍漢な奴に論理とか言われてもなあ w
頓珍漢な奴に論理とか言われてもなあ w
913デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
2017/12/16(土) 17:23:42.81ID:+Cq6iaDY0 >>910
なるほど。
ちょっと変形してビット演算でも行けるな。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
fputs(i & 2 ? "ぽよん" : "おっぱい", stdout);
if ((i & 3) == 3) putchar('\n');
}
return 0;
}
なるほど。
ちょっと変形してビット演算でも行けるな。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
fputs(i & 2 ? "ぽよん" : "おっぱい", stdout);
if ((i & 3) == 3) putchar('\n');
}
return 0;
}
914デフォルトの名無しさん (ワッチョイ 92e1-kSiG)
2017/12/16(土) 19:24:56.53ID:lAe10LAt0 #include <stdio.h>
#include <stdlib.h>
void o(){ fputs("おっぱい", stdout); }
void p(){ fputs("ぽよん", stdout); }
void r(){ puts(""); }
void e(){ exit(0); }
void (*a[])() = { o,o,p,p,r,o,o,p,p,r,e };
int main(){ void (**x)()=a; while(1) (*x++)(); }
#include <stdlib.h>
void o(){ fputs("おっぱい", stdout); }
void p(){ fputs("ぽよん", stdout); }
void r(){ puts(""); }
void e(){ exit(0); }
void (*a[])() = { o,o,p,p,r,o,o,p,p,r,e };
int main(){ void (**x)()=a; while(1) (*x++)(); }
915デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
2017/12/16(土) 20:18:31.50ID:ftZRkd7o0 >>877
>struct hoge *tmp = (struct hoge *)0; と書くだろう
このように書いても*正しく*NULLポインタが代入される
char zero[(struct hoge *)] = {0};
memcpy(tmp, zero, sizeof zero);
としないとダメ
逆によく見かけるポインタを含む構造体をmemcpyで0に初期化するのも正しく無い
>struct hoge *tmp = (struct hoge *)0; と書くだろう
このように書いても*正しく*NULLポインタが代入される
char zero[(struct hoge *)] = {0};
memcpy(tmp, zero, sizeof zero);
としないとダメ
逆によく見かけるポインタを含む構造体をmemcpyで0に初期化するのも正しく無い
916デフォルトの名無しさん (ワッチョイ 926e-zS+j)
2017/12/16(土) 20:46:52.08ID:V7dZrSJp0917デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
2017/12/16(土) 21:04:20.92ID:ftZRkd7o0 意図を残すために間違ったコードを書くとは理解に苦しむ
コメントで残した方が数百倍マシ
コメントで残した方が数百倍マシ
918デフォルトの名無しさん (ワッチョイ 926e-zS+j)
2017/12/16(土) 21:54:17.26ID:V7dZrSJp0 ほほう、どう間違ったと言うのかね?
919デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/16(土) 22:30:35.99ID:wOa8xeUW0920デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/16(土) 23:26:06.26ID:TBmZZU6f0921デフォルトの名無しさん (ワッチョイ eb55-ngMC)
2017/12/17(日) 00:31:42.98ID:8cbKB5iV0 >>915
ポインタはmemcpyできるのか?
ポインタはmemcpyできるのか?
922デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
2017/12/17(日) 04:55:34.79ID:vowUucL80923デフォルトの名無しさん (ワッチョイ cb8a-QofM)
2017/12/17(日) 07:23:21.30ID:0WraWVJn0 標準ライブラリ使用禁止な
924デフォルトの名無しさん (ワッチョイ 12b3-jdna)
2017/12/17(日) 08:07:20.40ID:RRxF0FwT0925デフォルトの名無しさん (ワッチョイ ef9f-v37J)
2017/12/19(火) 08:30:52.67ID:SEIe84in0 お、収まったか・・・
926デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
2017/12/19(火) 21:03:25.54ID:6p/5Z93J0 完全初心者です。文字列の性質について質問させてもらいます。
柴田望洋著 「ポインタ完全攻略」という書籍にて次のような内容の記載があります。
・文字列リテラルは変数ではないが記憶域を占有する
・文字列リテラルはcharの配列である
そして次のページに、
・このような文字列リテラルは、整数にいいかえると「定数」に相当するものであるから、自由に取り扱うためには
変数に格納する必要性がある
・そこで利用されるのがcharの配列である
ここでわかりかねるのが、文字列リテラルというのはそもそも定義自体が「charの配列」であるはずなのに、
これをまた「charの配列」に格納するの??と、疑問に思ってしまったわけです。
これはいったいどういうことでしょうか。
柴田望洋著 「ポインタ完全攻略」という書籍にて次のような内容の記載があります。
・文字列リテラルは変数ではないが記憶域を占有する
・文字列リテラルはcharの配列である
そして次のページに、
・このような文字列リテラルは、整数にいいかえると「定数」に相当するものであるから、自由に取り扱うためには
変数に格納する必要性がある
・そこで利用されるのがcharの配列である
ここでわかりかねるのが、文字列リテラルというのはそもそも定義自体が「charの配列」であるはずなのに、
これをまた「charの配列」に格納するの??と、疑問に思ってしまったわけです。
これはいったいどういうことでしょうか。
927デフォルトの名無しさん (ワッチョイ eb55-ngMC)
2017/12/19(火) 21:09:32.75ID:M/iOujl40928片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/19(火) 21:18:36.23ID:3xf/peDqd "This is C string literal."
これが文字列リテラルね。参照すると文字列定数になる。
char s[] = "This is character array.";
これが文字の配列の変数sの宣言と初期化ね。sはヌル文字を含めた文字列データ先頭を参照する。sizeof(s)は、ヌル文字を含めたデータのサイズになる。
const char *p = "This is pointer to characters.";
これは文字列の先頭へのポインタになる。サイズはアドレスのサイズ。データは変更できない。
これが文字列リテラルね。参照すると文字列定数になる。
char s[] = "This is character array.";
これが文字の配列の変数sの宣言と初期化ね。sはヌル文字を含めた文字列データ先頭を参照する。sizeof(s)は、ヌル文字を含めたデータのサイズになる。
const char *p = "This is pointer to characters.";
これは文字列の先頭へのポインタになる。サイズはアドレスのサイズ。データは変更できない。
>>926
ちょっと進んだ知識になるのですが。
プログラムがコンパイルされたのち、プログラムの実行の段階にはいったとき、コードや変数領域やその他もろもろがメモリ上に展開されるわけですが、
文字リテラルは、場合によってはメモリ上の書き込み不可能の場所に置かれます。たとえば ROM メモリとか。
もし、その文字リテラルを適宜書き換えて使いたいのならば、書き込み可能な場所にコピーして使うでしょう、それが、変数であり配列でありするわけです。
ただし文字リテラルを書き換えることが可能な環境では、それを見越して、文字リテラルを書き換えて対応する、という手がないわけではありません。
まあ一般的には行儀が悪いと思われています。それに文字リテラルを途中で長くしたい、とかは不可能ですし。
ちょっと進んだ知識になるのですが。
プログラムがコンパイルされたのち、プログラムの実行の段階にはいったとき、コードや変数領域やその他もろもろがメモリ上に展開されるわけですが、
文字リテラルは、場合によってはメモリ上の書き込み不可能の場所に置かれます。たとえば ROM メモリとか。
もし、その文字リテラルを適宜書き換えて使いたいのならば、書き込み可能な場所にコピーして使うでしょう、それが、変数であり配列でありするわけです。
ただし文字リテラルを書き換えることが可能な環境では、それを見越して、文字リテラルを書き換えて対応する、という手がないわけではありません。
まあ一般的には行儀が悪いと思われています。それに文字リテラルを途中で長くしたい、とかは不可能ですし。
930デフォルトの名無しさん (ワッチョイ af36-zS+j)
2017/12/19(火) 21:21:47.79ID:MoA6J0CR0 >>926
おまえさんが疑問に思っているのはこういうことか?
puts("aho"); で済むのを、わざわざ
static const char array[] = "aho";
puts(array); としなければならないのかと
おまえさんが疑問に思っているのはこういうことか?
puts("aho"); で済むのを、わざわざ
static const char array[] = "aho";
puts(array); としなければならないのかと
931デフォルトの名無しさん (ワッチョイ dee7-j1NZ)
2017/12/19(火) 21:24:55.16ID:x8VtX8Fx0 複数の文字列の先頭番地を便利に参照したいぐらいじゃないかな。
932デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
2017/12/19(火) 22:51:39.70ID:6p/5Z93J0 >>927
>>928
>>929
>>930
>>931
みなさんお騒がせいたしました。みなさんから頂いたアドバイスを参考にさせていただいて、
よく考えてみたところ、あまり深く気にするべきではないように感じてきました。
先ほどの本の「配列による文字列」「ポインタによる文字列」という箇所を読み込んだところ、
「配列による文字列」はcharの配列を宣言して文字列を用いる場合で、「ポインタによる文字列」
は「char p* = "ABC"」のように、ポインタchar *を宣言してなんらかの文字列リテラルで初期化する
手法であるとのことです。
おそらく・・・よくわかりませんが、直観的に私が当初感じていた疑問点というのはここら辺の部分に帰結
する話だと思われます。
現段階での私の理解
・文字列はそもそも配列?などということは気にしなくてもよい。
・文字列を配列charに格納してからポインタで操作する方法がある。この場合は当然配列の規則に従う
ので代入とかはできない
・char * = "ABC" のようにchar[]を宣言せずに文字列をポインタで操作する方法もあり。
この場合は p = "SEX" のような代入ができる。
>>928
>>929
>>930
>>931
みなさんお騒がせいたしました。みなさんから頂いたアドバイスを参考にさせていただいて、
よく考えてみたところ、あまり深く気にするべきではないように感じてきました。
先ほどの本の「配列による文字列」「ポインタによる文字列」という箇所を読み込んだところ、
「配列による文字列」はcharの配列を宣言して文字列を用いる場合で、「ポインタによる文字列」
は「char p* = "ABC"」のように、ポインタchar *を宣言してなんらかの文字列リテラルで初期化する
手法であるとのことです。
おそらく・・・よくわかりませんが、直観的に私が当初感じていた疑問点というのはここら辺の部分に帰結
する話だと思われます。
現段階での私の理解
・文字列はそもそも配列?などということは気にしなくてもよい。
・文字列を配列charに格納してからポインタで操作する方法がある。この場合は当然配列の規則に従う
ので代入とかはできない
・char * = "ABC" のようにchar[]を宣言せずに文字列をポインタで操作する方法もあり。
この場合は p = "SEX" のような代入ができる。
933片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/19(火) 22:57:18.83ID:3xf/peDqd char *p = "string";
はconstがない時代の古い書き方だよ。
良い子は
const char *p = "string";
のようにconstを付けること。
はconstがない時代の古い書き方だよ。
良い子は
const char *p = "string";
のようにconstを付けること。
934デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
2017/12/19(火) 23:01:45.80ID:6p/5Z93J0935デフォルトの名無しさん (ワッチョイ 1680-zkGJ)
2017/12/19(火) 23:37:54.35ID:jfHXMkXp0 immutable・不変かどうかの区別。
不変オブジェクトは、メモリ内の読み込み専用エリアに置けるので、最適化しやすいから、
できる限り、不変が望ましい
Ruby, JavaScript では、文字列は可変オブジェクトだが、freeze すると更新できない
s = "hello"
s.freeze
よく覚えていないけど、この本が良かった気がする。
詳説 Cポインタ、オライリー、2013
不変オブジェクトは、メモリ内の読み込み専用エリアに置けるので、最適化しやすいから、
できる限り、不変が望ましい
Ruby, JavaScript では、文字列は可変オブジェクトだが、freeze すると更新できない
s = "hello"
s.freeze
よく覚えていないけど、この本が良かった気がする。
詳説 Cポインタ、オライリー、2013
936デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
2017/12/19(火) 23:44:08.13ID:SEIe84in0 char *s = "abc";
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。
man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。
man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。
937デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
2017/12/20(水) 00:00:34.09ID:FD+Ux1Ht0938デフォルトの名無しさん (ワッチョイ 92e3-4pIx)
2017/12/20(水) 01:15:20.03ID:52iYTq0Y0 >>932
よく言われることだけど、cに文字列型はない
cで文字列という時は必ず文字の配列のこと
char * p = "ABC";
は
char x[] = { 'A', 'B', 'C', 0};
char * p = x;
って書くのを少し楽に書けるようにしてくれてるだけ
プログラミング自体の初心者なら、cで文字列を扱うこと自体を後回しにした方がいいと思う
よく言われることだけど、cに文字列型はない
cで文字列という時は必ず文字の配列のこと
char * p = "ABC";
は
char x[] = { 'A', 'B', 'C', 0};
char * p = x;
って書くのを少し楽に書けるようにしてくれてるだけ
プログラミング自体の初心者なら、cで文字列を扱うこと自体を後回しにした方がいいと思う
939デフォルトの名無しさん (ワッチョイ af36-zS+j)
2017/12/20(水) 06:46:09.98ID:63AN+5MK0 > cで文字列を扱うこと自体を後回し
俺もそう思う
ど初心者にはちとキツい
俺もそう思う
ど初心者にはちとキツい
940デフォルトの名無しさん (ワッチョイ b761-OyZG)
2017/12/20(水) 07:39:29.61ID:megjw+LT0 char x[] = { 'A', 'B', 'C', 0}; は.dataに保存されるから同じじゃないだろ。
941デフォルトの名無しさん (ワッチョイ 6361-4pIx)
2017/12/20(水) 07:57:37.46ID:5B0wk23g0 宗教戦争勃発!
942デフォルトの名無しさん (ワッチョイ 92a6-ak+6)
2017/12/20(水) 09:01:12.50ID:RLul2dZl0 const教は良い教義だと思うけどな。
943デフォルトの名無しさん (ワッチョイ 1287-e1v7)
2017/12/20(水) 09:12:25.93ID:wldcomI70 組み込み屋の俺から言わせれば、constは常識。
944デフォルトの名無しさん (スッップ Sd32-rGrM)
2017/12/20(水) 09:19:53.06ID:ohJmu0wUd ROMに追い出すconstの嵐w
#pragma でもいいけれど。
#pragma でもいいけれど。
945デフォルトの名無しさん (ワッチョイ af36-zS+j)
2017/12/20(水) 10:35:07.90ID:63AN+5MK0 C++にconstexprがあるのはconstの設計ミス
946デフォルトの名無しさん (ササクッテロレ Spc7-e1v7)
2017/12/20(水) 11:33:29.38ID:9SrStGF7p >>944
いや、const無くても文字リテラル自身はROMに書かれてるんだけど、デフォルトはそれをわざわざ初期化の時にRAMに展開して書き換えられてもいいように準備して待ってるんだよな。
それがもったないからconst付けるんだ。
いや、const無くても文字リテラル自身はROMに書かれてるんだけど、デフォルトはそれをわざわざ初期化の時にRAMに展開して書き換えられてもいいように準備して待ってるんだよな。
それがもったないからconst付けるんだ。
947デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
2017/12/20(水) 11:48:57.84ID:g9yiCifSa948デフォルトの名無しさん (ササクッテロレ Spc7-e1v7)
2017/12/20(水) 12:57:32.06ID:9SrStGF7p949デフォルトの名無しさん (ワッチョイ af36-zS+j)
2017/12/20(水) 13:49:50.09ID:63AN+5MK0 constつーか__attribute__((section(".rodata")))だろ
950デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
2017/12/20(水) 20:21:08.31ID:ap2qT8fO0 >>932です。
みなさんありがとうございます。
C言語では文字列を扱うのは難しいようですね。
しかし使うだけであれば「なんとなく感覚的」に可能か?と思われます。
ところで、ネットや本でC言語の難所はポインタだ!とよく書いてますが、この文字列の部分というは正に
ややこしい部分ではないでしょうか?
ポインタと配列の関係性の理解だけでも一山あります。
それが文字列となると、ポインタ+配列+文字列の知識の理解、となってしまって。
構造体を勉強するのが先でしょうか。
みなさんありがとうございます。
C言語では文字列を扱うのは難しいようですね。
しかし使うだけであれば「なんとなく感覚的」に可能か?と思われます。
ところで、ネットや本でC言語の難所はポインタだ!とよく書いてますが、この文字列の部分というは正に
ややこしい部分ではないでしょうか?
ポインタと配列の関係性の理解だけでも一山あります。
それが文字列となると、ポインタ+配列+文字列の知識の理解、となってしまって。
構造体を勉強するのが先でしょうか。
951片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 20:43:26.94ID:hN2yOtWhd >>950
この程度で難しいというなら、あきらめてJavaに行った方が身のためだ。
plain Cは時代遅れで、そのまま使うとセキュリティに穴があるシステムを量産してしまう。
Cはロボットにまかせて、人間はC++みたいな高度なプログラムを使うことが望ましい。
この程度で難しいというなら、あきらめてJavaに行った方が身のためだ。
plain Cは時代遅れで、そのまま使うとセキュリティに穴があるシステムを量産してしまう。
Cはロボットにまかせて、人間はC++みたいな高度なプログラムを使うことが望ましい。
952デフォルトの名無しさん (ワッチョイ af36-zS+j)
2017/12/20(水) 20:47:28.16ID:63AN+5MK0953デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
2017/12/20(水) 21:24:09.39ID:ap2qT8fO0 >>951
最近プログラミングが騒がれているのでpythonを始めたのですが、どうもプログラミングしてる感
が持てないためC言語をかじりだしたのです。
javaはコードが長そうなので嫌な感じですね。C++はえらく難しいらしいですし...
まあpythonかrubyが普通に使えるくらいになれば十分なのですが...
最近プログラミングが騒がれているのでpythonを始めたのですが、どうもプログラミングしてる感
が持てないためC言語をかじりだしたのです。
javaはコードが長そうなので嫌な感じですね。C++はえらく難しいらしいですし...
まあpythonかrubyが普通に使えるくらいになれば十分なのですが...
954デフォルトの名無しさん (ワッチョイ 4771-exlo)
2017/12/20(水) 21:34:16.38ID:WuO+qrMG0 >>953
まずプログラミングしてる感が十分感じられるくらいまでpythonに慣れましょう
まずプログラミングしてる感が十分感じられるくらいまでpythonに慣れましょう
955デフォルトの名無しさん (ワッチョイ ffb3-AOQJ)
2017/12/20(水) 21:35:23.89ID:bl+FG2Ud0 余所の芝が青く見えるので、そっちをつまみぐいする進め方は
正直どっちも中途半端に覚えてるつもりになって、実際には道具として使えてない状態に陥りそう
正直どっちも中途半端に覚えてるつもりになって、実際には道具として使えてない状態に陥りそう
>>953
C++ は教育的配慮に欠けていて、自力でなんとかしないといけない部分が多いし、ここ5〜6 年で規格がばたばた改定されたのに教科書が追いついていない
ついでに私もC++11later には追いつけていない(;;)
プログラムしている感は満載なんですけれども。
java は、資格とかもあり教育的な環境が整っているし書籍も多い、言語的な紛れもC++ に比べると少ない、個人的にはお勧めです。
プログラムしている感は、それなりにあると思います。
python 私もやっているんだけれども、つづりミスに悩まされています。なにか、いい支援環境はないものでしょうか?
C++ は教育的配慮に欠けていて、自力でなんとかしないといけない部分が多いし、ここ5〜6 年で規格がばたばた改定されたのに教科書が追いついていない
ついでに私もC++11later には追いつけていない(;;)
プログラムしている感は満載なんですけれども。
java は、資格とかもあり教育的な環境が整っているし書籍も多い、言語的な紛れもC++ に比べると少ない、個人的にはお勧めです。
プログラムしている感は、それなりにあると思います。
python 私もやっているんだけれども、つづりミスに悩まされています。なにか、いい支援環境はないものでしょうか?
957片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 21:44:52.24ID:hN2yOtWhd >>953
Pythonで何かをあやつることをやってみたら? GIMPや、Inkscapeや、IoTデバイスとかをあやつってみるんだよ。
Pythonで何かをあやつることをやってみたら? GIMPや、Inkscapeや、IoTデバイスとかをあやつってみるんだよ。
958片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 21:49:51.24ID:hN2yOtWhd Pythonは万能だから、株取引とか天気予報の表示とかニュースフィードとか、思い付く限りのことができるぜ。
959デフォルトの名無しさん (ワッチョイ 1681-A+LL)
2017/12/20(水) 22:26:42.84ID:YMSTlUWa0 >>958
地震を予測してみてくれ
地震を予測してみてくれ
960デフォルトの名無しさん (ワッチョイ 1681-iA8U)
2017/12/20(水) 22:28:37.10ID:w4Ra0RsW0 イスラエルのスパイ組織に電話でもして聞けば
961片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 22:38:41.88ID:hN2yOtWhd962片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 22:44:09.10ID:hN2yOtWhd とかテキトーなことを言ってみるテスト。
963デフォルトの名無しさん (ワッチョイ 1681-iA8U)
2017/12/20(水) 22:45:25.57ID:w4Ra0RsW0 地下水で地盤ががたがたになったところを爆弾で引き金ひいてるだけだよ
964片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 22:46:01.11ID:hN2yOtWhd でも人類は地球の中身を見ることも出来ないでしょ?
965片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
2017/12/20(水) 22:48:45.17ID:hN2yOtWhd 知り合いの宇宙人はみんな人類をバカにしてるぞ。
966デフォルトの名無しさん (ワッチョイ 1681-A+LL)
2017/12/20(水) 23:27:29.43ID:YMSTlUWa0 「日本沈没」だと、細菌が地震の原因だとされた
967デフォルトの名無しさん (ワッチョイ 1680-zkGJ)
2017/12/20(水) 23:47:53.69ID:nn3v7K500 >>956
【Microsoft Tech Summit】APP017 PowerShellの新しい相棒 Visual Studio Code
http://www.youtube.com/watch?v=0zo6z0yHrGk
2017/01/23 に公開された動画
【Microsoft Tech Summit】APP017 PowerShellの新しい相棒 Visual Studio Code
http://www.youtube.com/watch?v=0zo6z0yHrGk
2017/01/23 に公開された動画
>>966
これかな?
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%B2%88%E6%B2%A1
最近読んだので記憶は確かだが、細菌が地震の原因とは書かれていなかった
地球内マントルの対流の動きが変わり、ちょうど日本の真下でマントルが持ち上がるように変化した、という推測でストーリーは進んでいる
これかな?
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%B2%88%E6%B2%A1
最近読んだので記憶は確かだが、細菌が地震の原因とは書かれていなかった
地球内マントルの対流の動きが変わり、ちょうど日本の真下でマントルが持ち上がるように変化した、という推測でストーリーは進んでいる
969デフォルトの名無しさん (ワッチョイ 1681-iA8U)
2017/12/20(水) 23:52:58.62ID:w4Ra0RsW0 デンバー地震でぐぐれ
970デフォルトの名無しさん (ワッチョイ 1681-iA8U)
2017/12/20(水) 23:54:03.48ID:w4Ra0RsW0 そしたら探査船ちきゅうでぐぐれ
なんで非キリスト教国のまわりばっかり掘ろうとしてるんですかね
なんで非キリスト教国のまわりばっかり掘ろうとしてるんですかね
971デフォルトの名無しさん (ワッチョイ 1681-iA8U)
2017/12/20(水) 23:54:55.60ID:w4Ra0RsW0 プログラム板じゃねーかここ
だまされた
だまされた
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【サッカー】驚異の42得点0失点 中国を怒涛の5連勝に導いた日本人指揮官がまさかの退任か。協会対応に国民激怒 [征夷大将軍★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- ( ・᷄ὢ・᷅ )あ?
- フェリー予約したw
- 【画像】童貞は絶ッッッ対"4"を選ぶバレー部J Kが寮でパンパンの集合写真見つけちゃったwwwwwwwwwwwwww [904880432]
- ブタをぶったたく
- とうとう袖なしジージャン買ったったwww
- こんな自転車乗ってたやつがいたら?
