簡単なコードをCとスポーツ競技"な種類の課題"エラー
-
22-08-2019 - |
質問
だけのシンプルなプログラムへのポインタ.のプログラムは、内容の一部を私の記憶に文字配列を逆順にメモリ読み出します。イタリアンモーダアプリをみ降のメモリアドレスして大事にしていきたいと思い切に保管してください順に文字配列の型になります。
私のコンパイラに保聞かせていただきまして:"エラー互換性のない種類の課題"
のの realloc 機能
なぜですか?私のように見える"逆引き"およびその結果 realloc べきポインタ型char?
私のコード:
int main(){
char first[]="hello mark", strng='h', reverse[]="";
char* ptr=&first[10];
int i=0;
while(ptr > (&strng-0xf4240)){
printf("%c", *ptr--);
reverse = realloc(reverse, (i++ * sizeof(char)));
reverse[strlen(reverse)-i] = *ptr;
}
printf("%s", reverse);
return 0;
}
感謝です。
編集:また誤って掲載してこれらのコメントとして以下の
謝のために、第一-第二言わかった!って、必要な#含まれません確かに忘れてコピーしてスタックオーバーフロー.また、今だに非null終了strlen().ま題としています。感謝!
また、この集大丈夫であり論理エラーになります。のがループを実行します。しかし、その後のループが失敗にかかわらず、初期値ん。線の原因となるの失敗を行うことをrealloc
解決
あなたは最初の場所でmallocされていなかったメモリをreallocをすることはできません。あなたは「のchar *」として逆を宣言してから開始することををmallocする必要があります。
これは、あなたが軌道に乗るだろうが、あなたは本当に時間に、チャンクではなく、1つのバイトをreallocingについて考える必要があります。ああ、私はあなたがstrlen関数をしようとすると、おそらく、NULLで終端されていない「逆」という事実修正する気にしませんでした - 。私は読者の演習として残しておきますが、
int main(){
char first[]="hello mark", strng='h';
char* reverse;
char* ptr=&first[10];
reverse = (char*)malloc(1);
reverse[0] = '\0';
int i=0;
while(ptr > (&strng-0xf4240)){
printf("%c", *ptr--);
reverse = (char*)realloc(reverse, (i++ * sizeof(char)));
reverse[strlen(reverse)-i] = *ptr;
}
printf("%s", reverse);
return 0;
}
他のヒント
のいずれかの
- ま索コードをCと
C++コンパイラです。そのためには考え
必要なものをキャストのvoid*返される
による
realloc
をchar*.の 変換する法C.
または
- 失敗するなどの
stdlib.h
, ので、コンパイラは考えrealloc
を返しますint
編集
読みのコードは、再び、実際に問題はご提供を配列ではないが許可され、右の課題(な'lvalue').でご紹介いただきまし...続きを受け入れその他の答えはなかった。でも良いです。
あなたが最初の場所でmallocされていなかったメモリをreallocをすることはできません。
再割り当てするためには、malloc関数は、あなたが操作するメモリの塊にいくつかのadditionnal情報を持っていなければならないためはい、間違いなく真、(どちらかのブロックalocationテーブルを通じて、またはちょうどあなたのポインタの前に4バイトに格納されています)。しかし、あなたはまだ書くことができます:
char * ptr1 = malloc(16);
char * ptr2 = ptr1 + 8;
ptr2 = realloc(ptr2,32);
そして、あなたは、コンパイラのエラーを持っていないでしょう。あなたはおそらくまだかかわらず、実行時にセグメンテーション違反になるだろう。
しかし、方法の根本的な違いがあるCコンパイラ扱い
char * tab = "toto";
と
char tab[] = "toto";
最初のケースでは、タブ char *型のポインタであり、そして任意の通常の変数のような左辺値です。それはおそらくレジスタにほとんどの時間を常駐、またはヒープ上のアドレスである可能性があります。 第二のケースでは、タブは、アレイ、一定であり、したがって、左辺値ではありません。それはおそらく、文字列「TOTO」のためのデータが存在するあなたのバイナリ実行のテキスト部分を指すアドレスでアセンブリレベルで置き換えられます。