我正在寻找重新分配一个没有自由字符串的双字符数组,这是我的代码:
char **rea_scd_array(char **src, int add)
{
char **ret;
int i;
i = 0;
while (src[i] != '\0')
i++;
ret = (char**) malloc(sizeof(char*) * (i + add + 1));
ret[i + add] = '\0';
while (i >= 0)
{
ret[i] = &src[i][0];
i--;
}
free(&src);
return (ret);
}
我的想法是在其中添加新维度以存储字符串,而无需重新分配数组的所有表并复制所有旧内容。
我的代码无效,我知道
`"malloc: *** error for object 0x7fff5fbff9e8: pointer being freed was not allocated
set a breakpoint in malloc_error_break to debug"`
我只想释放存储指向字符串的指针的第二个数组维。
有什么想法吗?
答案 0 :(得分:2)
您正试图释放您从未分配过内存的src
。您释放动态分配给堆的内存(通常通过malloc
)。
答案 1 :(得分:1)
您的实现会强制您在数组末尾添加NULL
指针。
以下代码行让我怀疑这是你的意图:
while (src[i] != '\0')
ret[i + add] = '\0';
如果是NULL
而不是'\0'
,那么我会另有想法(尽管它们基本相同)。
除此之外,使用大于1的add
会得到一个包含一些"垃圾指针"的数组。
无论如何,此时我们有两个选项(不包括realloc
):
NULL
指针指示数组的结尾。len
变量来指示数组的长度。第二种选择更有效率,所以你会更好。
选项#1:
char **rea_scd_array(char **src, int add)
{
char **ret;
int i;
int len = 0;
while (src[len] != NULL)
len++;
ret = (char**) malloc(sizeof(char*) * (len + add + 1));
for (i=0; i<len; i++)
ret[i] = src[i];
for (; i<len+add+1; i++)
ret[i] = NULL; // necessary in order for this function to work correctly
free(src);
return ret;
}
选项#2:
char **rea_scd_array(char **src, int len, int add)
{
char **ret;
int i;
ret = (char**) malloc(sizeof(char*) * (len + add));
for (i=0; i<len; i++)
ret[i] = src[i];
for (; i<len+add; i++)
ret[i] = NULL; // necessary for other functions that are using this array
free(src);
return ret;
}
在这两种情况下,您都需要分配初始数组,并在此函数之外用NULL
指针填充它。
答案 2 :(得分:0)
如果您事先不知道尺码并且不想realloc
,请使用单链表:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char *data;
struct node *next;
} t_node;
extern char *strdup(const char *);
t_node *insert(t_node *node, char *s)
{
t_node *new = malloc(sizeof(*new));
if (new == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
new->data = strdup(s);
if (new->data == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
new->next = NULL;
if (node != NULL) node->next = new;
return new;
}
int main(void)
{
t_node *temp, *first, *node = NULL;
node = first = insert(node, "First");
node = insert(node, "Second");
node = insert(node, "Third");
node = insert(node, "Last");
node = first;
while (node) {
printf("%s\n", node->data);
temp = node->next;
free(node->data);
free(node);
node = temp;
}
return 0;
}