2012-04-24 5 views
0

どのようにベクトルのように動作するcで配列を定義できますか?この配列は、任意の量の値を取る必要があります。 0または10の値または100の値を取ることができます。cでのベクターの複製

以下のコードは動作しますが、スタックが壊れているランタイムエラーが発生します。

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

は同様にどのように私は、文字列を作るために最後にヌル文字が続く文字の任意の量を取るためにchar* strを使用することができますか?インタビューのための

実践:)あなたのforループで

+0

コードで実行時エラーが発生した場合は動作しません。あなたがしようとしているのは、 'i'の割り当てられたメモリを越えて書き込むことです。これはセグメンテーションフォールトにつながります。 C++ベクタは基本的に動的配列であり、その周囲に細心の注意を払っています。 Cでベクターを複製しようとしている場合は、あなたがやっていることよりもはるかに多くのことがありますが、あなたがどれくらい努力しているのか分かりません。 – birryree

+0

真実なのですが、正しい方法を知りたいのです。 –

+3

もうひとつは、C++の 'std :: vector'は何をしようとしていますか?すべて?基本的なのは、おそらく、ポインタとサイズを定義する 'int'を持つstructを実装し、そのような構造体を取ってそれらを操作する一連の関数を書くことです。ポインタはあなたの動的配列です。動的配列だけが必要な場合は、[C memory allocation](http://en.wikipedia.org/wiki/C_dynamic_memory_allocation)を使用する方法を学んでください。 – birryree

答えて

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の定義などの詳細を記入しておきます。

+0

ありがとう! –

1

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

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

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

1

これはあまり難しくありません。重要なことは、malloc(...)またはcalloc(...)を使用して配列のメモリを最初に割り当てる必要があることです。その後、アイテムが追加または削除されるときに、メモリを簡単に割り当てる(または割り当てを解除する)ことができます。メモリを動的に追加または削除する方法は、realloc(...)です。 C Dynamic Memory Allocationの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; 
} 
+0

素敵な例:) –