1

ベクトルのように機能する配列をcで定義するにはどうすればよいですか?この配列は、任意の量の値を取る必要があります。0値または10値または100値を取ることができます。

以下のコードは機能しますが、スタックが破損しているというランタイムエラーが発生します。

int i = 0;
    int* aPtr = &i;
    int* head = aPtr;
    for(i=0;i<6;i++){
        (*aPtr)=i;
        aPtr++;
    }

同様にchar* str、文字列を作成するために、任意の数の文字の後にヌル文字を続けるためにどのように使用できますか?

面接の練習:)

4

3 に答える 3

2

要件に応じて、Cでこれを行う方法はたくさんありますが、「任意の数の値」(通常はメモリに収まる数だけを意味します)と言いました。これは通常realloc、配列のサイズを動的に拡大するために使用されます。アレイが大きくなるにつれて、アレイのサイズに関する簿記情報も保持する必要があります。

void
store (vector_t * v, int idx, int value)
{
  if (v->size < idx) {
     v->size = idx * 2;
     v->data = realloc(v->data, v->size);
  }
  v->data[idx] = value;
}

これは「宿題」とタグ付けされているので、vector_tの定義など、入力する詳細をいくつか残しました。

于 2012-04-24T18:51:30.717 に答える
1

あなたのforループでは、最初の反復の後、以前に宣言または予約されていないメモリ位置を指すaPtrにアクセスしようとしています。最初の反復でint iは、メモリの割り当てを行いました。

ただし、を使用して必要なメモリを最初に割り当てることができますmalloc。このメモリが割り当てられると、割り当てられたスタックスペースのみをウォークスルーすると、実行時エラーが発生することはありません。

PS:コンパイルするだけではコードは機能しません。どのプログラムにも、実行時エラーとコンパイル時エラーが含まれている可能性があります。コードサンプルは、実行時エラーの非常に一般的な例です。

于 2012-04-24T18:44:57.293 に答える
1

これはそれほど難しいことではありません。覚えておくべき重要なことは、malloc(...)またはcalloc(...)を使用して、最初にアレイにメモリを割り当てる必要があるということです。その後、アイテムが追加または削除されるときに、メモリを簡単に割り当て(または割り当て解除)できます。(配列内のアイテムを格納するために使用される)メモリを動的に追加または削除する方法は、realloc(...)です。C動的メモリ割り当てのwikiページは、実際にはかなり有益です。最初にchar*配列を割り当て、次にサイズを増やしてサイズを減らす方法を示す例を以下に示します。

#include "stdio.h"
#include "stdlib.h"

int main()
{
  char *myDynamicString;

  /* allocate initial memory */
  myDynamicString = (char *)malloc(sizeof(char) * 2);
  myDynamicString[1] = '\0';

  /* set values */
  myDynamicString[0] = 'A';

  /* prints: A */
  printf("String: %s\n", myDynamicString);

  /* make string bigger */
  myDynamicString = (char *)realloc(myDynamicString, sizeof(char) * 6);
  myDynamicString[5] = '\0';

  /* set values */
  myDynamicString[1] = 'P';
  myDynamicString[2] = 'P';
  myDynamicString[3] = 'L';
  myDynamicString[4] = 'E';

  /* prints: APPLE */
  printf("Bigger String: %s\n", myDynamicString);

  /* make string smaller */
  myDynamicString = (char *)realloc(myDynamicString, sizeof(char) * 3);
  myDynamicString[2] = '\0';

  /* set values */
  myDynamicString[1] = 'Z';

  /* prints: AZ */
  printf("Smaller String: %s\n", myDynamicString);

  /* don't forget to release the memory */
  free(myDynamicString);

  return 0;
}
于 2012-04-24T18:47:38.233 に答える