スタック領域

スタック領域について整理する

下のプログラムは何も結果が表示されない

#include <stdio.h>

char *makeline(char *title, char *auther, char *bunko, int year) {
    char line[100];

    sprintf(line, "「%s」 %s  %s  %d",
            title, auther, bunko, year);

    return line;
}

int main(void) {
    printf("%s\n",
           makeline("hogehoge", "hoge太郎", "hoge文庫", 1969));

    return 0;
}

原因:リターンしている配列lineがスタック上に確保されているため。

これを回避するには結果を入れる配列をパラメータに渡す

#include <stdio.h>

char *makeline(char *line,
               char *title, char *auther, char *bunko, int year) {
    
    sprintf(line, "「%s」 %s  %s  %d",
            title, auther, bunko, year);

    return line;
}

int main(void) {
    char line[100];
    
    printf("%s\n",
           makeline(line, "hogehoge", "hoge太郎", "hoge文庫", 1969));

    return 0;
}

出力結果
「hogehoge」 hoge太郎 hoge文庫 1969

スタックのイメージ

ローカル変数
リターンアドレス等の復帰情報
パラメータ

※スタックは下から上に伸びて行く