ローカル変数のメモリにそのスコープ外でアクセスできますか?

1060

私は次のコードを持っています。

#include <iostream>

int * foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int* p = foo();
    std::cout << *p;
    *p = 8;
    std::cout << *p;
}

そして、コードは実行時の例外なしで実行されています!

出力は 58

どうしてですか?ローカル変数のメモリは、その関数の外部からアクセスできませんか?

20 answers

4836
Eric Lippert 2011-06-23 10:01.

どうしてですか?ローカル変数のメモリは、その関数の外部からアクセスできませんか?

あなたはホテルの部屋を借ります。ベッドサイドテーブルの一番上の引き出しに本を置いて寝ます。あなたは翌朝チェックアウトしますが、あなたの鍵を返すことを「忘れて」ください。あなたは鍵を盗みます!

1週間後、ホテルに戻り、チェックインせず、盗まれた鍵を持って古い部屋に忍び込み、引き出しを調べます。あなたの本はまだそこにあります。驚くべき!

どうしてそれができるのでしょうか?部屋を借りていない場合、ホテルの部屋の引き出しの中身にアクセスできませんか?

まあ、明らかにそのシナリオは現実の世界で問題なく発生する可能性があります。部屋にいることを許可されなくなったときに本が消えるような不思議な力はありません。また、鍵を盗まれて部屋に入るのを妨げる不思議な力もありません。

ホテルの管理者はあなたの本を削除する必要はありません。あなたは彼らと契約を結んでおらず、あなたが物を置き去りにすると、彼らはあなたのためにそれを細断するだろうと言っていました。盗まれた鍵を持って不法に部屋に戻って戻ってきた場合、ホテルのセキュリティスタッフはあなたが忍び込んだのを捕まえる必要はありません。あなたは彼らと契約を結んでいませんでした。部屋の後で、あなたは私を止める必要があります。」むしろ、あなたは彼らと「後で私の部屋に忍び込まないことを約束する」という契約に署名しました。それはあなたが破った契約です

この状況では、何でも起こり得ます。本はそこにあることができます-あなたは幸運になりました。他の誰かの本がそこにあり、あなたの本がホテルのかまどにある可能性があります。あなたが入ったときに誰かがあなたの本をバラバラに引き裂いてそこにいる可能性があります。ホテルはテーブルと本を完全に取り外して、ワードローブと交換することができたはずです。ホテル全体が取り壊されてサッカースタジアムに置き換わる可能性があり、忍び寄っている間に爆発で死ぬことになります。

何が起こるかわかりません。ホテルをチェックアウトし、後で違法に使用するための鍵を盗んだとき、システムの規則に違反すること選択したため、予測可能で安全な世界に住む権利を放棄しました。

C ++は安全な言語ではありません。それはあなたが元気にシステムのルールを破ることを可能にします。許可されていない部屋に戻って、もうそこにいないかもしれない机をくまなく探し回るなど、違法で愚かなことをしようとしても、C ++はあなたを止めません。C ++よりも安全な言語は、パワーを制限することでこの問題を解決します。たとえば、キーをより厳密に制御します。

更新

神聖な良さ、この答えは多くの注目を集めています。(理由はわかりません-私はそれを単なる「楽しい」小さなアナロジーだと考えましたが、何でもです。)

これをもう少し技術的な考えで更新するのは密接な関係があるのではないかと思いました。

コンパイラーは、そのプログラムによって操作されるデータのストレージを管理するコードを生成するビジネスを行っています。メモリを管理するためのコードを生成する方法はたくさんありますが、時間の経過とともに2つの基本的な手法が定着してきました。

1つ目は、ストレージ内の各バイトの「ライフタイム」、つまり、プログラム変数に有効に関連付けられている期間を事前に簡単に予測できない、ある種の「長寿命」ストレージ領域を用意することです。時間の。コンパイラーは、必要なときにストレージを動的に割り当て、不要になったときにストレージを再利用する方法を知っている「ヒープマネージャー」への呼び出しを生成します。

2番目の方法は、各バイトの存続期間がよく知られている「短命」のストレージ領域を用意することです。ここでは、ライフタイムは「ネスト」パターンに従います。これらの短命の変数の中で最も長命の変数は、他の短命の変数の前に割り当てられ、最後に解放されます。寿命の短い変数は、寿命の長い変数の後に割り当てられ、それらの前に解放されます。これらの短命の変数の存続期間は、長命の変数の存続期間内に「ネスト」されます。

ローカル変数は後者のパターンに従います。メソッドが入力されると、そのローカル変数が有効になります。そのメソッドが別のメソッドを呼び出すと、新しいメソッドのローカル変数が有効になります。最初のメソッドのローカル変数が死ぬ前に、それらは死んでしまいます。ローカル変数に関連付けられたストレージの有効期間の開始と終了の相対的な順序は、事前に把握できます。

このため、ローカル変数は通常、「スタック」データ構造上のストレージとして生成されます。スタックには、最初にプッシュされたものが最後にポップされたものになるというプロパティがあるためです。

まるでホテルが順番に部屋を借りるだけで、部屋番号がチェックアウトするまでチェックアウトできないようなものです。

それでは、スタックについて考えてみましょう。多くのオペレーティングシステムでは、スレッドごとに1つのスタックを取得し、スタックは特定の固定サイズに割り当てられます。メソッドを呼び出すと、ものがスタックにプッシュされます。次に、元のポスターがここで行っているように、スタックへのポインタをメソッドから戻すと、それは完全に有効な100万バイトのメモリブロックの中央へのポインタにすぎません。私たちの例えでは、あなたはホテルをチェックアウトします。あなたがそうするとき、あなたはちょうど最も大きい数の占有された部屋からチェックアウトしました。あなたの後に誰もチェックインせず、あなたが不法にあなたの部屋に戻った場合、あなたのすべてのものはこの特定のホテルにまだそこにあることが保証されています

一時的な店舗には、本当に安くて簡単なスタックを使用しています。ローカルのストレージにスタックを使用するために、C ++の実装は必要ありません。ヒープを使用できます。プログラムが遅くなるので、そうではありません。

C ++の実装では、スタックに残したゴミをそのままにしておく必要はありません。これにより、後で違法に戻ってくることができます。コンパイラが、空いたばかりの「部屋」内のすべてをゼロに戻すコードを生成することは完全に合法です。繰り返しになりますが、それは高くつくからではありません。

スタックが論理的に縮小したときに、以前は有効だったアドレスが引き続きメモリにマップされるようにするために、C ++の実装は必要ありません。実装は、オペレーティングシステムに「スタックのこのページの使用は終了しました。特に断りのない限り、以前に有効だったスタックページに誰かが触れた場合にプロセスを破棄する例外を発行します」と伝えることができます。繰り返しになりますが、実装は遅くて不必要であるため、実際にはそれを行いません。

代わりに、実装により、間違いを犯してそれを回避することができます。ほとんどの時間。ある日まで、本当にひどいことがうまくいかず、プロセスが爆発します。

これには問題があります。ルールはたくさんあり、誤って破るのはとても簡単です。私は確かに何度もあります。さらに悪いことに、この問題は、メモリが破損したことが発生してから数十億ナノ秒後にメモリが破損していることが検出された場合にのみ表面化することがよくあります。

より多くのメモリセーフ言語は、あなたの力を制限することによってこの問題を解決します。「通常の」C#では、ローカルのアドレスを取得して返す方法や、後で使用するために保存する方法はありません。ローカルのアドレスを取得することはできますが、言語は巧妙に設計されているため、ローカルの存続期間が終了した後は使用できません。ローカルのアドレスを取得して返すには、コンパイラを特別な「安全でない」モードにし、プログラムに「安全でない」という単語入れて、おそらく実行しているという事実に注意を喚起する必要があります。ルールを破る可能性のある危険な何か。

さらに読むために:

  • C#が参照を返すことを許可した場合はどうなりますか?偶然にも、それは今日のブログ投稿の主題です:

    https://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/

  • なぜスタックを使用してメモリを管理するのですか?C#の値の種類は常にスタックに保存されていますか?仮想メモリはどのように機能しますか?そして、C#メモリマネージャーがどのように機能するかについてのより多くのトピック。これらの記事の多くは、C ++プログラマーにも密接に関係しています。

    https://ericlippert.com/tag/memory-management/

278
Rena 2011-06-23 19:43.

ここで行っているのは、以前はのアドレスであったメモリの読み取りと書き込みですa。の外にいるfooので、これはランダムなメモリ領域へのポインタにすぎません。あなたの例では、そのメモリ領域が存在し、現在それを使用しているものは他にありません。あなたはそれを使い続けることによって何も壊さず、そして他に何もまだそれを上書きしていません。したがって、5はまだそこにあります。実際のプログラムでは、そのメモリはほとんどすぐに再利用され、これを行うことで何かが壊れます(ただし、症状はずっと後になるまで表示されない場合があります!)

から戻るとfoo、そのメモリを使用していないことをOSに通知し、別のメモリに再割り当てできるようにします。運が良ければ、再割り当てされることはなく、OSがそれを再び使用していることに気付かない場合は、うそをつきます。ただし、そのアドレスで終わるものは何でも上書きしてしまう可能性があります。

コンパイラが文句を言わない理由がわからない場合は、おそらくfoo最適化によって排除されたためです。通常、この種のことについて警告します。Cは、自分が何をしているのかを知っていることを前提としています。技術的には、ここではスコープに違反しておらず(a外部への参照はありませんfoo)、エラーではなく警告のみをトリガーするメモリアクセスルールのみです。

つまり、これは通常は機能しませんが、偶然に機能する場合もあります。

152
msw 2010-05-19 16:33.

収納スペースはまだ踏みつけられていなかったからです。その振る舞いを当てにしないでください。

84
Michael 2011-06-26 04:19.

すべての答えへの少しの追加:

あなたがそのようなことをするなら:

#include<stdio.h>
#include <stdlib.h>
int * foo(){
    int a = 5;
    return &a;
}
void boo(){
    int a = 7;

}
int main(){
    int * p = foo();
    boo();
    printf("%d\n",*p);
}

出力はおそらく次のようになります:7

これは、foo()から戻った後、スタックが解放され、boo()によって再利用されるためです。実行可能ファイルを分解すると、はっきりと表示されます。

72
Charles Brunet 2011-06-23 04:15.

C ++では、あなたができる任意のアドレスにアクセスし、それはあなたが意味するものではありませんはず。アクセスしているアドレスは無効になっています。fooが戻った後、他に何もメモリをスクランブルしないために機能しますが、多くの状況でクラッシュする可能性があります。Valgrindを使用してプログラムを分析するか、最適化してコンパイルしてみてください...

67
Kerrek SB 2011-06-23 04:15.

無効なメモリにアクセスしてC ++例外をスローすることはありません。任意のメモリ位置を参照するという一般的な考え方の例を示しているだけです。私はこのように同じことをすることができます:

unsigned int q = 123456;

*(double*)(q) = 1.2;

ここでは、123456をdoubleのアドレスとして扱い、それに書き込みます。さまざまなことが起こる可能性があります。

  1. q実際には、実際にはdoubleの有効なアドレスである可能性がありますdouble p; q = &p;
  2. q 割り当てられたメモリ内のどこかを指している可能性があり、そこで8バイトを上書きします。
  3. q 割り当てられたメモリの外側を指し、オペレーティングシステムのメモリマネージャがセグメンテーション違反信号をプログラムに送信し、ランタイムがそれを終了させます。
  4. あなたは宝くじに当選します。

設定方法は、返されたアドレスがメモリの有効な領域を指している方が少し合理的です。おそらくスタックの少し下にあるためですが、それでも無効な場所であり、決定論的なファッション。

通常のプログラム実行中に、そのようなメモリアドレスのセマンティック妥当性を自動的にチェックする人は誰もいません。ただし、などのメモリデバッガvalgrindはこれを問題なく実行するため、プログラムを実行してエラーを確認する必要があります。

29
gastush 2011-06-23 04:12.

オプティマイザーを有効にしてプログラムをコンパイルしましたか?foo()機能は非常に簡単で、インライン化や結果のコードに置き換えられている場合があります。

しかし、結果として生じる振る舞いは未定義であるというマークBに同意します。

23
Chang Peng 2011-06-23 18:45.

あなたの問題はスコープとは何の関係もありません。表示されているコードでは、関数mainは関数内の名前を認識しfooないためaこの名前を外部から直接fooにアクセスすることはできませんfoo

あなたが抱えている問題は、不正なメモリを参照するときにプログラムがエラーを通知しない理由です。これは、C ++標準が不正なメモリと正当なメモリの間の明確な境界を指定していないためです。ポップアウトスタック内の何かを参照すると、エラーが発生する場合と発生しない場合があります。場合によります。この振る舞いを当てにしないでください。プログラム時に常にエラーが発生すると想定しますが、デバッグ時にエラーが発生することはないと想定します。

18
Brian R. Bondy 2010-05-19 16:33.

メモリアドレスを返しているだけです。許可されていますが、おそらくエラーです。

はい、そのメモリアドレスを逆参照しようとすると、未定義の動作が発生します。

int * ref () {

 int tmp = 100;
 return &tmp;
}

int main () {

 int * a = ref();
 //Up until this point there is defined results
 //You can even print the address returned
 // but yes probably a bug

 cout << *a << endl;//Undefined results
}
18
Kerrek SB 2011-06-25 11:57.

これは、2日前にここで説明されていない古典的な未定義の動作です。サイト内を少し検索してください。一言で言えば、あなたは幸運でしたが、何かが起こった可能性があり、あなたのコードはメモリへの無効なアクセスを行っています。

18
AHelps 2011-06-25 12:04.

Alexが指摘したように、この動作は未定義です。実際、ほとんどのコンパイラは、クラッシュを発生させる簡単な方法であるため、これを実行しないように警告します。

発生する可能性のある不気味な動作の例については、次のサンプルを試してください。

int *a()
{
   int x = 5;
   return &x;
}

void b( int *c )
{
   int y = 29;
   *c = 123;
   cout << "y=" << y << endl;
}

int main()
{
   b( a() );
   return 0;
}

これは「y = 123」を出力しますが、結果は異なる場合があります(本当に!)。あなたのポインタは、他の無関係なローカル変数を破壊しています。

18
sam 2015-08-17 20:30.

すべての警告に注意してください。エラーを解決するだけではありません。
GCCはこの警告を示しています

警告:ローカル変数「a」のアドレスが返されました

これがC ++の力です​​。あなたは記憶を気にする必要があります。では-Werrorフラグ、この警告はエラーをbecames、今、あなたはそれをデバッグする必要があります。

17
Adrian Grigore 2011-06-24 05:31.

スタックがそこに置かれてから(まだ)変更されていないため、これは機能します。a再度アクセスする前に、他のいくつかの関数(他の関数も呼び出しています)を呼び出してください。おそらくもうそれほど幸運ではないでしょう... ;-)

16
Alexander Gessler 2011-06-25 11:57.

あなたは実際に未定義の振る舞いを呼び出しました。

一時的な作品のアドレスを返しますが、関数の終わりに一時的なものが破棄されるため、それらにアクセスした結果は未定義になります。

したがってa、変更したのではなく、以前のメモリ位置を変更しましたa。この違いは、クラッシュする場合とクラッシュしない場合の違いと非常によく似ています。

14
larsmoa 2011-06-23 04:18.

一般的なコンパイラの実装では、コードを「メモリブロックの値を、以前はa占められていたアドレスで出力する」と考えることができます。また、ローカルを含む関数に新しい関数呼び出しを追加するintと、の値a(またはa以前はポイントしていたメモリアドレス)が変更される可能性が高くなります。これは、スタックが異なるデータを含む新しいフレームで上書きされるために発生します。

ただし、これは未定義の動作であり、動作するためにこれに依存しないでください。

14
littleadv 2011-06-25 11:57.

aは、スコープ(foo関数)の存続期間中に一時的に割り当てられる変数であるため、可能です。fooメモリから戻った後は空いていて、上書きすることができます。

あなたがしていることは、未定義の振る舞いとして説明されています。結果を予測することはできません。

12
Mykola 2011-06-25 05:07.

:: printfを使用し、coutを使用しない場合、コンソール出力が正しい(?)ものは劇的に変化する可能性があります。以下のコード(x86、32ビット、MSVisual Studioでテスト済み)内でデバッガーを試してみることができます。

char* foo() 
{
  char buf[10];
  ::strcpy(buf, "TEST”);
  return buf;
}

int main() 
{
  char* s = foo();    //place breakpoint & check 's' varialbe here
  ::printf("%s\n", s); 
}
5
Ghulam Moinul Quadir 2017-07-19 21:07.

関数から戻った後、メモリの場所に保持されている値ではなく、すべての識別子が破棄され、識別子がないと値を見つけることができませんが、その場所には以前の関数によって保存された値が含まれています。

だから、ここの機能は、foo()のアドレスを返すaa、そのアドレスを返した後に破壊されます。そして、その返されたアドレスを介して変更された値にアクセスできます。

実際の例を見てみましょう。

男が場所にお金を隠し、場所を教えてくれたとしましょう。しばらくすると、お金の場所を教えてくれた男が亡くなります。しかし、それでもあなたはその隠されたお金にアクセスできます。

4
Ayub 2017-03-09 05:25.

これは、メモリアドレスを使用する「ダーティ」な方法です。アドレス(ポインタ)を返すとき、それが関数のローカルスコープに属しているかどうかはわかりません。ただの住所です。'foo'関数を呼び出したので、 'a'のアドレス(メモリ位置)は、アプリケーション(プロセス)の(少なくとも今のところは安全に)アドレス可能なメモリにすでに割り当てられています。'foo'関数が返された後、 'a'のアドレスは 'dirty'と見なすことができますが、そこにあり、クリーンアップされておらず、プログラムの他の部分(少なくともこの特定の場合)の式によって妨害/変更されていません。AC / C ++コンパイラは、このような「ダーティ」アクセスを阻止しません(ただし、気になる場合は警告する可能性があります)。何らかの方法でアドレスを保護しない限り、プログラムインスタンス(プロセス)のデータセグメントにある任意のメモリ位置を安全に使用(更新)できます。

1
Nobun 2019-05-03 00:17.

あなたのコードは非常に危険です。ローカル変数(関数の終了後に破棄されたと見なされます)を作成し、破棄された後にその変数のメモリのアドレスを返します。

つまり、メモリアドレスが有効であるかどうかにかかわらず、コードはメモリアドレスの問題(セグメンテーション違反など)に対して脆弱になります。

これは、まったく信頼できないポインタにメモリアドレスを渡しているため、非常に悪いことをしていることを意味します。

代わりに、この例を検討して、テストしてください。

int * foo()
{
   int *x = new int;
   *x = 5;
   return x;
}

int main()
{
    int* p = foo();
    std::cout << *p << "\n"; //better to put a new-line in the output, IMO
    *p = 8;
    std::cout << *p;
    delete p;
    return 0;
}

あなたの例とは異なり、この例では次のようになります。

  • intのメモリをローカル関数に割り当てる
  • そのメモリアドレスは、関数の有効期限が切れても有効です(誰も削除しません)
  • メモリアドレスは信頼できます(そのメモリブロックは空きとは見なされないため、削除されるまで上書きされません)
  • 使用しない場合は、メモリアドレスを削除する必要があります。(プログラムの最後にある削除を参照してください)

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

グッドジョブ、ESPN

グッドジョブ、ESPN

今日のホワイトハウスの記者会見で、報道官のサラ・ハッカビー・サンダースは、スポーツセンターのホストであるイェメル・ヒルのドナルド・トランプに関する最近のツイートについてコメントするよう求められ、大統領と彼の政策を白人至上主義者として説明した。ヒルは彼女のつぶやきのためにESPNによって公に叱責されました。

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

基本的に頭のあらゆる部分から髪の毛を整えたり、ブロードライしたり、まっすぐにしたり、脱毛したりする必要がある場合は、このレミントンゴールドボックスが最適です。今日だけ、Amazonは、すでに人気のあるShortcut Pro Self-HaircutKitやPearlPro Ceramic Flat Ironのように、グルーミングをはるかに簡単にするヘアツールをマークダウンしています。

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

トゥパックシャクール(ティムモーゼンフェルダー/ゲッティイメージズ); マヤアンジェロウ(マーティンゴッドウィン/ゲッティイメージズ)移動、テイラースウィフト。ケンドールとカイリーは、必要な数の座席を持っています。

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

写真:Tesla Motorsフロリダに住んでいて、Tesla Model S、Model X 60、またはModel 60Dを使用している場合、車の自律性は50 km(約30マイル)高くなります。これは失敗ではなく、ハリケーンイルマによる避難作業を容易にするために会社自身が命じた自治権の一時的な延長です。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language