0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C】初めてのC言語(18. 文字列の受け渡し)

Posted at

はじめに

学習環境

  • 今回はpaiza.ioのC言語のエディタを使いました。

C言語の文字列に関する業界ルール

文字列を扱う際の基本ルールとして、以下の4箇条が挙げられていました。
今回新たに登場したのは3~4番目の内容です。

  1. 先頭要素から順に1文字ずつ文字コードを格納して、文字列を表す。
  2. 最後の文字の直後には、「文字コード0の文字」を必ず格納する。そして、それより後ろのメモリ空間は無視するものとし、利用しない。
  3. 文字列情報を別関数などに渡す場合は、先頭文字のアドレスだけを渡す。
  4. 配列を実現するためのメモリ領域を確保する手段は問わない。

文字列を別の関数に渡す

  • 文字列を別の関数に渡す場合、先頭文字のアドレスを渡すのがルールとなりますが...
  • char型配列で表された文字列の場合、配列変数が「配列の先頭要素の位置を示すアドレス」と等しいため、(表面的には)文字列をそのまま関数の引数として渡すことができます。
Main.c
#include <stdio.h>

int main(void){
    char str[] = "Hello";
    
    // 関数の引数として、文字列の先頭要素のアドレスを渡すことができる。
    printf("%s\n", &str[0]);
    
    // 「配列=先頭要素の位置を示すアドレス」のため、
    // 文字列(char型配列)をそのまま関数の引数として渡すことができる。
    printf("%s\n", str);
    
    return 0;
}
実行結果
Hello
Hello

文字列の管理

  • C言語の世界では、文字列は「先頭アドレスを使って管理する」のが一般的だそうです。
  • そのため、先頭アドレスそのものについても「文字列」と呼ぶことが多いそうです。
Main.c
#include <stdio.h>

int main(void){
    char str[20] = "Hello,world!";
    char* buff = str;  // 先頭アドレスを代入
    
    // どちらも同じ出力結果となる。
    printf("%s\n", str);
    printf("%s\n", buff);
    
    return 0;
}
実行結果
Hello,world!
Hello,world!

文字列の実現手段

  • 文字列は連続したメモリ領域さえ確保できれば良いので、様々な方法で文字列を作ることができます。
    • 以下の「方法3」では、malloc関数を使ってヒープにメモリ領域を確保して、そこに文字列を作っています。
  • また、str1は内容変更があってはならない静的領域に置かれるため、文字列をconst char*型としています。
    • 静的領域のデータに対してconstを着けないと、組み込み機器などでは意図せずメモリアクセス違反になることがあるそうです。
  • なおstr1str3は、それぞれ以下のメモリ領域に置かれます。
    • str1:静的領域に置かれる。
    • str2:スタック領域に置かれる。
    • str3:ヒープ領域に置かれる。
Main.c
#include <stdio.h>

// p.409
// 
int main(void){
    // 方法1:文字列リテラルでメモリを確保する。
    const char* str1 = "Test";
    printf("%s\n", str1);
    
    // 方法2:char配列を使う。
    char str2[1024] = "Test";
    printf("%s\n", str2);
    
    // 方法3:mallocでメモリを確保する。
    char* str3 = (char*)malloc(1024);
    str3[0] = 'T';
    str3[1] = 'e';
    str3[2] = 's';
    str3[3] = 't';
    str3[4] = '\0';
    printf("%s\n", str3);
    free(str3);  // 最後にヒープ領域を解放する。

    return 0;
}
実行結果
Test
Test
Test

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?