gpt4 book ai didi

c - 分配字符串数组

转载 作者:行者123 更新时间:2023-11-30 16:17:08 25 4
gpt4 key购买 nike

我正在尝试创建一个数组来存储多个字符串。字符串的最大大小为 100。

这就是我的结构:

typedef struct
{
int size;

int capacity;

char** elements;

} array_strings;

我在以下函数中为空数组分配空间:

array_strings *array_strings_new()
{
array_strings *vec;

vec = (array_strings *)malloc(sizeof(array_strings));
if (vec == NULL)
return NULL;

vec->size = 0;
vec->capacity = 0;
vec->elements = NULL;

return vec;
}

然后我尝试使用以下函数在 vector 的末尾插入元素:

int array_strings_insert(array_strings *vec, char *string, int pos)
{
int i;

if (vec == NULL || pos < -1 || pos > vec->size)
return -1;

/* increases capacity if needed */
if (vec->size == vec->capacity)
{
if (vec->capacity == 0)
vec->capacity = 1;
else
vec->capacity *= 2;


vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
for (int i = 0; i < vec->capacity; i++)
{
vec->elements[i] = realloc(vec->elements[i], 100*sizeof(char));
}
if (vec->elementos == NULL)
return -1;
}

/* if pos=-1 inserts at the end of the array */
if (pos == -1)
pos = vec->size;

/* Copy elements from pos to pos+1 until the end of the array */
for (i = vec->size - 1; i >= pos; i--)
{
strcpy(vec->elements[i + 1], vec->elements[i]);
}

/* copy string */
strcpy(vec->elements[pos], string);

vec->size++;

return pos;
}

当我尝试插入字符串时,我得到“realloc():无效指针已中止(核心转储)”。

有人可以告诉我我做错了什么吗?

谢谢,

<小时/>

我尝试这样做:

vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
for (int i = 0; i < vec->capacity; i++)
{
vec->elements[i] = NULL;
vec->elements[i] = realloc(vec->elements[i], 100*sizeof(char));
}
if (vec->elementos == NULL)
return -1;
}

我不再收到“realloc():无效指针中止(核心转储)”。然而,由于某种原因,数组的第一个元素是空的。

最佳答案

您编写的 realloc 代码将破坏之前存储的字符串。例如如果数据大小从 2 增加到 4,前 2 个字符串将丢失。

您可以按如下方式修改 realloc 部分。

int prevcapacity;
if (vec->size == vec->capacity)
{
prevcapacity = vec->capacity;
if (vec->capacity == 0)
vec->capacity = 1;
else
vec->capacity *= 2;

vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
for (int i = prevcapacity; i < vec->capacity; i++)
{
vec->elements[i] = malloc(vec->elements[i], 100*sizeof(char));
}
}

在这种情况下,您可以对分配的额外字符串使用malloc。之前的字符串将被保留。

关于c - 分配字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56340571/

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