2012-04-24 83 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采取后面的空字符结束,使字符串中的字符任何金额是多少?

实践采访:)

+0

如果你的代码给你提供了运行时错误,那么它不起作用。你所要做的就是写入'i'分配的内存,这会导致分段错误。 C++向量基本上是动态数组,它周围有细微的变化。如果你想用C复制一个矢量,那么它比你所做的还要多,但我不知道你想要做多少。 – birryree 2012-04-24 17:53:21

+0

是真的,这就是为什么我想知道正确的方法 – 2012-04-24 17:55:20

+3

嗯,对于一件事,你想要做什么呢,C++'std :: vector'呢?一切?基本的是实现一个结构,它可能有一个指针和一个定义大小的int,然后编写一堆接受这些结构并对它们进行操作的函数,指针就是你的动态数组。如果您只想要一个动态数组,请学习使用[C内存分配](http://en.wikipedia.org/wiki/C_dynamic_memory_allocation)。 – birryree 2012-04-24 17:56:36

回答

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

非常感谢! – 2012-04-24 19:10:18

1

在你的for循环中,第一次迭代后,您试图访问APTR指向其未声明或保留之前的存储位置。在第一次迭代中,int i为你做了内存分配。

你可以做什么,虽然将初始化分配所需的内存使用malloc。 一旦这个内存被分配,并且如果你只通过分配的堆栈空间,你不会遇到运行时错误。

PS:如果只是编译,你的代码不起作用。任何程序都可能包含运行时和编译时错误。您的代码示例是运行时错误的常见示例。

1

这并不难。需要记住的重要一点是,您需要首先使用malloc(...)或calloc(...)为数组分配内存。之后,可以在添加或删除项目时轻松分配(或取消分配)内存。动态添加或删除内存(用于存储数组中的项目)的方法是realloc(...)。 C Dynamic Memory Allocation的维基页面实际上是非常丰富的。我在下面提供了一个示例,演示如何初始分配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

可爱的例子:) – 2012-04-24 18:52:33