以下のソースを実行すると、直値でアドレスをしていするのは
うまくアセンブラに展開され、意図するアドレスを取り出す
ことが出来るのですが、変数でアドレス演算させると意図する
アドレスが取得できません。
何か記述がおかしいのでしょうか?
ご存知の方宜しくお願い致します。
char const test_tbl[] = { -3, -2, -1, 0, 1, 2, 3, 4, 5};
unsigned char *ptr;
unsigned char work;
#define STA_OFFSET(&test_tbl[3])
void main( void)
{
// 適切なポインタが取得できる
ptr = (STA_OFFSET + 3);
// ポインタが取得できない。
work = 3
ptr = (STA_OFFSET + work);
}
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
こういった質問は、
「~」という方法で確認したら、「~」という結果を意図したにもかかわらず、「~」という結果だったと、そこをはっきり書かないと、回答はかなり難しいと思います。
どういう「意図しない」結果だったかは、解決の大きなヒントになるわけですが。
No.4
- 回答日時:
興味深いですね.私の環境では再現しませんでした.
使っているコンパイラは何でしょうか?
ざっとみて怪しいのは,wkがunsignedcharであること.
ポインタに unsigned charを加えるときの自動型変換で
トラブルが起きているのかも知れません.wkをintに変えたら
直りませんか?
No.3
- 回答日時:
同じものを表すときは、同じ型を使いましょう(特別な理由が無い限り)
どうしても同じ型で宣言できないときは型キャストもしょうがないでしょう。
test_tblをconst unsigned charに、とptrをconst unsgned char *に変えたら動きましたよ。
確認:VC++6
typedef unsigned char BYTE;
const BYTE test_tbl[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8'};
const BYTE *ptr;
BYTE work;
#define STA_OFFSET (&test_tbl[2])
int main(int argc, char *argv[])
{
ptr = STA_OFFSET + 1;
printf("%c\n",*ptr);
work = 2;
ptr = STA_OFFSET + work;
printf("%c\n",*ptr);
return 0;
}
No.2
- 回答日時:
test_tbl を const char [] で定義してるんだから, ポインタの ptr は const char * じゃないと.
記述としておかしいのはそこだけ. それでもダメなら, アセンブラレベルでどうなっているかチェックするか, コンパイラのバグを疑うかですね.
この回答への補足
失礼しました。
>> ポインタの ptr は const char * じゃないと
こちらも質問時の記載ミスです。
実際にはTypedefして使用しているのですが、 const char *
と同様の宣言をしております。
使用しているコンパイラでは、記憶型指定子というものを
つかって記述しています。
No.1
- 回答日時:
・型が悪い?
charは「文字型」です。整数を扱うなら「int」にしましょうか。
・セミコロンが無い
work=3 の行に;がありません。
・const
constの有無で弾かれます。STA_OFFSETを型キャストすれば通りましたが……
確認環境:VC++6
この回答への補足
説明不足ですいません。
・セミコロンが無いのは質問時に打ち直ししたためです。
実際はあります。書き間違いました。
・型は1Byteデータのテーブルです。実際はunsigned charを
予定しています。
・const は ROMに割り付けたいのでつけています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリから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言語でポインタ変数を用いた配...
おすすめ情報