我已经开始尝试使用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);
}
这段代码似乎给了我不明确的行为,是否有我遗漏的东西?谢谢
答案 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 ++方面听到这个,这里适用)。