0

(char* )str以下のコードでは何をしますか?

/**
 * Main file 
 */
#include <assert.h>
#include <mylib.h>

int main()
{
  const char str[] = "this is my first lab\n";
  int ret=1; 

  ret = my_print((char *)str, sizeof(str));

  assert(!ret);

  return 0;
}

このコードは私のインストラクターによって書かれています。my_printは、文字列へのポインタとその文字列のサイズを受け取る関数です。文字列をmy_print関数に渡すために(char *)strを使用する必要がある理由について混乱しています。それは実際に何をしますか?

4

3 に答える 3

10

それは捨てますconst

これはmy_print、メモリが読み取り専用としてマークされている可能性があるため、その文字列を変更した場合にプログラムがクラッシュする可能性があることを意味します。constしたがって、キャストを介して修飾子を削除することは一般的に悪い考えです。

あなたの場合、実装した人は誰でも、印刷される文字列を変更する必要がないと考えていたため、引数my_printを受け入れないように見えます。const char *

したがって、キャストの代わりに行う必要があるのは、の定義を変更して、最初のパラメーターとしての代わりにmy_printを受け入れることです。const char *char *

于 2013-03-08T11:44:00.813 に答える
4

それが「型キャスト」(または「型変換」)です。つまり、ある型を別の型として扱うようにコンパイラーに指示します。

この特定の変換が行うことは、定数文字列を定数ではないものとして扱うようにコンパイラーに指示することです。呼び出された関数が文字列を変更しようとすると、定数データの変更は未定義の動作であるため、機能しないか、プログラムがクラッシュする可能性があります。

于 2013-03-08T11:44:22.730 に答える
2

これは型キャストです。つまり、データ型を変更します。(char *)は、「pointertochar」型への型キャストを意味します

于 2013-03-08T11:44:10.220 に答える