C関数から文字列を返す方法

C関数から文字列を返す方法を学ぶ

私のCプログラムの1つで、関数から文字列を返すタスクがありました。

xxxxx myName() {
  return "Flavio";
}

トリッキーなことは、戻り値の型を定義することです。

Cの文字列です配列char要素なので、実際には文字列を返すことはできません。文字列の最初の要素へのポインタを返す必要があります。

これが私たちが使用する必要がある理由ですconst char*

const char* myName() {
  return "Flavio";
}

作業プログラムの例を次に示します。

#include <stdio.h>

const char* myName() {
  return "Flavio";
}

int main(void) { printf("%s", myName()); }

結果を変数に割り当てたい場合は、次のような関数を呼び出すことができます。

const char* name = myName();

私たちは書くことができますポインタオペレーター*この方法でも:

const char * myName()
const char *myName()

すべてのフォームは完全に有効です。

の使用に注意してくださいconst、関数から返されるのは文字列リテラル、定数である二重引用符で定義された文字列。

Cでは文字列リテラルを変更できないことに注意してください。

もう1つ覚えておくべきことは、ローカル変数として定義された文字列をC関数から返すことはできないということです。これは、関数の実行が終了すると変数が自動的に破棄(解放)され、使用できなくなるためです。たとえば、次のことを試してみてください。

#include <stdio.h>

const char* myName() {
  char name[6] = "Flavio";
  return name;
}

int main(void) { printf("%s", myName()); }

警告が表示され、次のようなジバリが発生します。

hello.c:5:10: warning: address of stack memory
      associated with local variable 'name'
      returned [-Wreturn-stack-address]
  return name;
         ^~~~
1 warning generated.
B��Z> K���⏎

Notice the B��Z> K���⏎ line at the end, which indicates that the memory that was first taken by the string now has been cleared and there’s other random data in that memory. So we don’t get the original string back.

Changing myName() to

const char* myName() {
  char *name = "Flavio";
  return name;
}

makes the program work fine.

The reason is that variables are allocated on the stack, by default. But declaring a pointer, the value the pointers points to is allocated on the heap, and the heap is not cleared when the function ends.

Download my free C Handbook


More clang tutorials: