
以下の様なNULLストップされていない文字列のprint文は問題があるのでしょうか
#include <stdio.h>
main()
{
char *x;
x = malloc( 2 );
x[0]= '0';
x[1]= '1';
printf("x(.2s):%.2s\n", x );
}
bcheckで確認すると以下の様なメッセージが出力されます。
-----------------------------------------------
}<rtc>非割り当て領域からの読み取り (rua):
1 バイト読み取り を アドレス 0x20d8a で しようとしました
それは 0x20d88 で始まる大きさ 2 バイト のヒープブロックの直後 です
このブロックは以下から割り当てられました:
[1] main() at 0x10834
エラーの位置:
=>[1] _doprnt(0x20b28, 0xfd51aad6, 0x0, 0x0, 0x40, 0xf71bd761)、アドレス 0xfd507760
[2] printf(0x20b28, 0x20d88, 0x5, 0x4, 0x0, 0x1)、アドレス 0xfd508720
[3] main(0x1, 0xffbef7fc, 0xffbef804, 0x20800, 0x0, 0x0)、アドレス 0x1085c
-----------------------------------------------
因みにpurifyではエラーとしては認識しませんでした。
No.2ベストアンサー
- 回答日時:
実際エラーになるようなプログラムがあるなら
問題あるでしょうね。
#1でも言われているように、printfの実装によると思います。
%sは、もともと0エンド文字列をお想定していますからそこに、0エンドしてない文字列を指定する方が(指定文字数がEOS:0まで達していないとしても)おかしいとも言えると思います。(つまり実装者は、EOSがあると想定しても良いプログラミングをしているので)
%cを使った方が意味的にもいいと思いますが。
回答ありがとうございます。エラーとはメモリーチェックのエラーのことですね。
確かに想定外の使い方ですから問題です。
%cに切り替えるか、0エンドに置き換えて使うようにします。

No.4
- 回答日時:
ふむ、処理系は何ですか?
"%2s" で3文字にしたら "012" と
表示されてるのですね。
おそらく偶然にも '2' の後ろが
NULL になってるんでしょう。
そうでないと printf には
3文字なんて分からないはず。
"%2s" なら NULL まで探してるのは確実ですよ。
実装というより printf の仕様的に。
"%2.2s" でもエラーになるのは
ちょっと不思議ですね。
これは printf の実装の違いなのかな。
ちなみに MS の VC++ 系の場合は、
Debug と Release で確保領域の初期化が
異なるので結果も異なりますけど・・・。
この回答への補足
ご返答ありがとうございます。
マシンはsolaris8です。
因みに"%2s"ではなく"%.2s"です。
ライブラリにUBCLIBがリンクされない状態のビルドではbcheckによるエラーは発生しなくなりました。なぜだか不明です。

No.3
- 回答日時:
そもそも、書式 %2s では
2文字で切り捨てる意味にはなりませんよ。
printf("%2s", "ABCD")
とやれば "ABCD" と表示されるはずです。
NULL まで探すのでアクセス違反になります。
2文字で制限するには "%2.2s" かな。
この場合、2文字までしか読まないはずなので
アクセス違反にもならないと思いますが。
回答ありがとうございます。
"%2.2s"で実行してみましたが、bcheckで同様に領域外読込みのエラーになってしまいました。
因みに
main()
{
char *x;
x = (char * )malloc( 3 );
x[0]= '0';
x[1]= '1';
x[2]= '2';
printf("x(.2s):%.2s\n", x );
}
の様に0エンドではないが、1文字多いとbcheckではエラーになりませんでした。
どうやらprintfの実装はNULLまでは探していないようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- 数学 場合の数、確率 45 (浜松医科大学) 1 2023/07/29 13:52
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
高(1)男子 初めてC言語でコー...
-
C言語で 選択肢: |?| |?| |?| 1...
-
C++
-
+NANってなんですか??
-
ダブルポインタで2次元配列を作成
-
書式制御'%d'と'%f'について
-
c言語でAからZまでを表示する...
-
printf関数の振る舞い?に関して
-
プログラムの演算時間を調べた...
-
至急!!!! C言語のこのプロ...
-
C&C++、計算結果を表示する
-
プログラミングでわからないと...
-
y=x^3-2x^2-3の解を求めるプロ...
-
プログラムの作成
-
C言語トランプの確率を計算につ...
-
Cの九九を表示するプログラム...
-
両替プログラムなど
-
C言語についてです。(困ってお...
-
最適化したプログラムによる計...
-
文字列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報