试图创建动态数组,给出意想不到的结果

时间:2014-07-30 16:45:49

标签: c arrays pointers

我已经开始尝试使用C并且我已经创建了描述向量的代码:

#include <stdlib.h>

#define RESIZE_CONSTANT 2

typedef struct
{
    char* contents;
    int length;
} V_Element;

typedef struct 
{
    V_Element* ElementList;
    int pos;
    int size;
} Vector;

Vector newVec(int size)
{
    Vector vec;
    vec.ElementList = malloc(size * sizeof(V_Element));
    vec.pos = 0;
    vec.size = size;

    if(vec.ElementList == NULL)
    {
        //Error
    }

    else
    {
        return vec;
    }
}

void reSize(Vector *vec)
{
    int newsize = vec->size * RESIZE_CONSTANT;
    vec->ElementList = realloc(vec->ElementList,  newsize * sizeof(V_Element));

    if(vec->ElementList != NULL)
    {
        vec->size = newsize;
    }
}

void push_back(Vector *vec, V_Element element)
{
    if(vec->size > vec->pos)
    {
        vec->pos++;
        vec->ElementList[vec->pos] = element;
    }

    if(vec->size <= vec->pos)
    {
        reSize(vec);
        push_back(vec, element);
    }   
}

V_Element* at(Vector *vec, int pos)
{
    if(pos > vec->size || pos > vec->pos)
    {
        return NULL;
    }

    else{
        return &vec->ElementList[pos];
    }
}

void delVector(Vector vec)
{
    free(vec.ElementList);
}

它具有检索推回和分配向量的功能,该向量只是一个V_Elements数组。

和主要:

#include <stdio.h>
#include <string.h>
#include "Vector.h"


int main()
{
    char input[2000];

    scanf("%s", &input);    

    V_Element a;
    a.contents = input;
    a.length = strlen(input);

    Vector test = newVec(5);
    push_back(&test, a);
    printf("%s", (at(&test, 0))->contents);
    delVector(test);

}

这段代码似乎给了我不明确的行为,是否有我遗漏的东西?谢谢

1 个答案:

答案 0 :(得分:2)

除了您最初看到的问题(并且Vinbot正确回答),您还需要考虑主要的测试代码,尤其是本节:

V_Element a;
a.contents = input;
a.length = strlen(input);

请记住,您没有复制字符串,而是复制指针值,这意味着如果您要更改输入的内容(例如,通过另一个scanf),那么您还将更改字符串中的字符串的值矢量的第一个元素。例如,考虑对您的主要修改:

int main()
{
    char input[2000];
    int   ndx;

    Vector   test = newVec(5);

    for(ndx = 0; ndx < 5; ndx++)
    {
       V_Element* pTemp = malloc(sizeof(V_Element));

       printf("enter %d string: ", ndx);
       fgets(input, 1999, stdin);

       pTemp->contents = input;
       pTemp->length = strlen(input);

       push_back(&test, *pTemp);
    }

    for(ndx = 0; ndx < 5; ndx++)
    {
        printf("(length: %d) %s", at(&test,ndx)->length, (at(&test, ndx))->contents);
    }
}

示例运行给出:

    [******@broadsword junk]$ ./vecTest
    enter 0 string: foo
    enter 1 string: bar
    enter 2 string: baz
    enter 3 string: foobar
    enter 4 string: foobarbaz
    (length: 4) foobarbaz
    (length: 4) foobarbaz
    (length: 4) foobarbaz
    (length: 7) foobarbaz
    (length: 10) foobarbaz

你应该考虑一下发生了什么,以及如何解决它。提示:这是浅拷贝与深拷贝的一个例子(你通常在C ++方面听到这个,这里适用)。