C の動的変数と静的変数
変数宣言は、すべての関数の外側または関数の内側にある可能性があります すべての関数の外側の宣言はグローバルであり、固定メモリ位置にあります static 宣言は、関数の外側の変数を「ファイル グローバル」として宣言します (他のソース ファイルのコードで参照することはできません) 宣言ブロック ステートメント {} (関数本体または関数本体内にネストされたブロック ステートメント) 内: 静的に宣言されていない限り、動的に割り当てられます プログラムの実行がブロックに入るときにメモリが割り当てられます 実行がブロックを出るときにメモリが解放されます 関数がそれ自体を呼び出す場合 (直接または間接的に)、動的変数の新しいセットを取得します(スタックフレームと呼ばれます)。これは、関数への他の呼び出しと同じように処理されます
問題があります。変数は、関数の側に割り当てられた変数です。動的変数result[]
を作成する必要があるため、その有効期間は関数の実行全体に渡って延長されます(スタックに割り当てられます!)。result
修正コード:
#include <stdio.h>
#include <string.h>
char* substr(char *source, int start, int length)
{
char* result;
char *r;
result=(char*)malloc(sizeof(char)*10);
r = result;
strncpy(result, source+start, length);
printf("substr: %s\n", r);
return r;
}
int main()
{
char* r=substr("HELLO", 1, 2);
printf("main: %s\n",r );
free(r)//Don't forget to free it!
}
result[]
または、次のようにグローバル変数を作成できます。
#include <stdio.h>
#include <string.h>
char result[10];//<======Global
char* substr(char *source, int start, int length)
{
char *r=result;
r = result;
strncpy(result, source+start, length);
printf("substr: %s\n", r);
return r;
}
int main()
{
printf("main: %s\n",substr("HELLO", 1, 2));
}