免费双数组char没有自由字符串

时间:2014-03-11 10:29:45

标签: c arrays

我正在寻找重新分配一个没有自由字符串的双字符数组,这是我的代码:

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"`

我只想释放存储指向字符串的指针的第二个数组维。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您正试图释放您从未分配过内存的src。您释放动态分配给堆的内存(通常通过malloc)。

答案 1 :(得分:1)

您的实现会强制您在数组末尾添加NULL指针。

以下代码行让我怀疑这是你的意图:

while (src[i] != '\0')
ret[i + add] = '\0';

如果是NULL而不是'\0',那么我会另有想法(尽管它们基本相同)。

除此之外,使用大于1的add会得到一个包含一些"垃圾指针"的数组。

无论如何,此时我们有两个选项(不包括realloc):

  1. 使用NULL指针指示数组的结尾。
  2. 使用len变量来指示数组的长度。
  3. 第二种选择更有效率,所以你会更好。

    选项#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;
}