お世話になっております。
C言語において、関数内で文字列のアドレスを変更した際の動作についてご質問させて下さい。
文字列の先頭2文字を削除する関数を作成したく、以下のようなfunc関数を作りました。
C
1#include<stdio.h> 2void func(char* str) 3{ 4 str = str+2; // 2文字ずらす 5 6 printf("%s\n", str); // 出力:cde 7 8 // これなら OK??? 9 //sprintf(str, "%s", str+2); 10} 11 12int main() 13{ 14 char str[256] = {"abcde"}; 15 16 func(str); 17 18 printf("%s", str); // 出力:abcde 19 20 return 0; 21} 22
func関数にchar*型のポインタを渡し、関数内で先頭アドレスをずらすようなイメージで作成しました。
char str[256] = {"abcde"}
とした場合、strは文字列の先頭アドレスを指している為、その先頭アドレスをずらしてやれば結果的に
先頭の文字が削除出来た風になると考えておりました。
・イメージ
str[0] = (アドレス:0x01) a
str[1] = (アドレス:0x02) b
str[2] = (アドレス:0x03) c
str[3] = (アドレス:0x04) d
str[4] = (アドレス:0x05) e
str[5] = (アドレス:0x06) \0
↓
str[0] = (アドレス:0x03) c
str[1] = (アドレス:0x04) d
str[2] = (アドレス:0x05) e
str[3] = (アドレス:0x05) \0
結果として、func関数内では望んでいた結果になりましたが、func関数を抜けると
文字列が元に戻ってしまいました。
また、func関数内のコメントアウト部分の様に、sprintf関数を使用して文字列をコピー?すると、
関数を抜けた後でも削除されたままになります。
基本的なことかもしれませんが、上記の場合何故関数を抜けると文字列が元に戻ってしまったのでしょうか。
なお、上記のプログラムはとりあえず適当に作った段階なので、
・文字が半角/全角の場合結果が異なる
・エンディアンの方式によって結果が異なる(多分???)
・そもそも、もっと適切な方法がある
…などの問題点があると思いますが、テストプログラムな為大目に見て頂けると幸いです。
お手数をお掛け致しますが、お願い致します。
回答2件
あなたの回答
tips
プレビュー