malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。
*********************************************
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
char *C;
C = (char *) malloc (sizeof(char) * 5);
C = "ABCD";
for(i = 0; i < 5; i++){
if(C[i] != NULL){
printf("%s", C[i]); ←※エラー※
}
}
free(C);
return 0;
}
*********************************************
正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?
No.1ベストアンサー
- 回答日時:
C[i] は、char で、%s の要求するchar * ではないから。
あと、
C = (char *) malloc (sizeof(char) * 5);
で確保したメモリに文字列を設定するには、
strcpy (または、strncpy,stpcpy)を使います。
C = "ABCD";
したら
free(C) は、malloc で確保したのとは違う領域を開放しようとしてエラーになります。(アドレスの代入によって、確保した領域はアクセスできなくなります)
printf で文字列を表示するなら
printf("%s", C);
で
1文字ずつ表示するなら
printf("%c",C[i]);
でします。
ご返答ありがとうございます。
strcpy関数を使えば良いという事だけではなく、内部的な動きまで丁寧に教えていただきとても理解できました。おかげで実行できました。
No.2
- 回答日時:
> C = (char *) malloc (sizeof(char) * 5);
ここでポインタ変数Cに、mallocで確保した領域へのポインタが代入されていますが、
> C = "ABCD";
ここで文字列リテラル"ABCD"を指すものに上書きされています。
結果として、mallocで確保した領域へのポインタが分からなくなってしまったので、
後でfreeで開放することができなくなります。(メモリリーク)
> C[i] != NULL
C[0]やC[1]は、ここでは'A'や'B'などの文字なので
ポインタであるNULLと比較するのはおかしいです。
文字である'\0'と比較したほうが意味が通ります。
C[i] != '\0'
> printf("%s", C[i]);
先に書いたように、C[i]は文字なので、
文字列(実際は文字列の先頭文字へのポインタ)を要求する%sと合わせて使うとおかしな結果になります。
(エラーの直接の原因はこれでしょう。)
printf("%c", C[i]);
もしくはループさせずに
printf("%s", C);
とするべきです。
> free(C);
先に書いたように、Cはこの時点で文字列リテラル"ABCD"を指しているので、
freeすると問題が発生するかもしれません。
ご返答ありがとうございます。
No,1様の回答にはなかった他の箇所の指摘と動きの説明までしていただき、とても理解できました。おかげで実行できるようになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 strstrの実装
-
DWORDとcharの変換
-
char型の文字列をウィンドウに...
-
C言語のintとcharの違いってな...
-
苦しんでCを読んでchar型は文字...
-
csvファイルをfscanfで読み込む...
-
fgetc( )の戻り値はなぜ整数??
-
CStringからchar*への型変換に...
-
文字列についていい方法はあり...
-
C言語にて構造体のメンバがNULL...
-
文字列のswap
-
なぜ?counterintuitive
-
C言語 配列の長さの上限
-
セグメントエラー
-
VBA基本構文の作り方 2列の...
-
c言語
-
mallocについて
-
C言語の関数と配列に関する質問
-
_tcscpy_s(wcscpy_s)の第二引数...
-
c#について、現在テトリスを作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
char 文字列型 の表現範囲が-12...
-
文字列str内の全ての数字を...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
小数点入りの文字列をfloat型に...
-
szとlpszの違い
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
おすすめ情報