gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:30 25 4
gpt4 key购买 nike

我已经开始尝试使用 C 进行试验,并且我已经创建了描述 vector 的代码:

#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);
}

它具有检索推回和分配 vector 的功能,它只是一个 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);

}

虽然这段代码似乎给了我未定义的行为,但我错过了什么吗?谢谢

最佳答案

除了您最初看到的问题(并由 Vinbot 正确回答)之外,您还需要考虑 main 中的测试代码,尤其是这一部分:

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

请记住,您不是在复制字符串,而是在复制指针值,这意味着如果您要更改输入的内容(比如通过另一个 scanf),那么您也会更改字符串中的值 vector 的第一个元素。例如,考虑对您的 main 进行此修改:

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++ 中听到这个,它在这里适用)。

关于c - 尝试创建动态数组,给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com