Cにあった問題

1848 ワード

今日は正の整数を出力する関数を作るつもりです.
1.cのポインタの初期化はどうしますか?それとも使わないの?
直接引用された住所があればやりやすい.
もしなかったら例えば次の例で直接値を入れたいのですが、他の初期化されていないアドレスと同じ処理エラーでは気づきにくいです
                        2.結果的に遭遇した宣言のポインタアドレスの初期化は意外にも同じです
         char *p,*pp;
	 *p++='1';
	 p=0;
	 put_strln(p);
	 put_strln(pp);

初期化は必要に違いないが、ポインタのアドレスはいったいどうなっているのだろうか.
宣言されたが初期化されていない開始アドレスは同じですか?
最終的に以下の方法に変更されました.この2つのポインタアドレスは同じですから
/**
 *      
 */
void put_int(int number){
  
  char *p,*pp;
  char leave=0;
  int count=0,length=0;
  
  pp=p;
  
  while(number!=0){
  
    leave=(number%10) & 0xFF; //  
	
	number/=10;
	
	leave+='0';
	
    *p++ =leave;
	count++;
  }
   
   
  length=count;
  pp+=count;
  
  while((count--) >0){
    *(pp++)=*(--p);
  } 
  
  *pp=0;
  pp-=length;
  put_str(pp);
}

最後に修正Pが1つの値を初期化していない場合、最初の出力は良いので、残りは問題があります.
/**
 *      
 */
void put_int(int number){
  
  char *p=0;
  char leave=0;
  int count=0,length=1;
  
  
  while(number!=0){
  
    leave=(number%10) & 0xFF; //  
	
	number/=10;
	
	leave+='0';
	
    *p++ =leave;
	count++;
  }
    *p=0;  
 
  while(count/2>=length){
    leave=*(p-count+length-1);
	*(p-count+length-1)=*(p-length);
	*(p-length)=leave;
	length++;
  } 
  
  put_str(p-count);
}

関数の宣言呼び出し順序
呼び出された関数が呼び出された関数の後ろに書いてある場合、コンパイラが見つからず、コンパイルは通過しません.
まずコンパイルする必要があります.つまり、この関数は前に置きます.
あるいは頭で宣言する.
ここで関数の呼び出しに問題があります.スタックパラメータを押し込んで使い切る解放の問題ですか?さもないと、きっと溢れてしまいます.
またc中の関数に戻り値がある呼び出し値の戻りはどうなっていますか?
Cでは割込み処理関数として
1.セグメント内の呼び出しは直接アドレスに圧入すればよい.
スタックを介してパラメータを渡すと、このパラメータは戻りアドレスの下にあります.保護モードのパラメータはesp+4である.
2.しかし、中断された呼び出しは特別です.
C関数で応答すると、最初のアドレスを戻りアドレスとして使用します(検討対象).残りはパラメータとして使用されます.
3.では、割り込み関数をCで処理するにはどうすればいいですか
于淵書のやり方は
最後に覚えている
シンボルはすべてアドレス