繁体   English   中英

每当我尝试对旧内存进行 delocate 时,我的程序都会崩溃

[英]My program crashes whenever i try to delocate the old memory

所以基本上有一个函数可以分配一个新的指针内存,当我尝试对旧的内存进行 delocate 时,程序基本上会崩溃我的代码

char** AddingToTheBook(char** original, int* size, char *number)
{
    char** newArray = (char**)malloc(sizeof(char*)*(*size));
    //allocating and copying the values
    for (int i = 0; i < *size; i++)
    {
        *(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))));
        strcpy(*(newArray + i), *(original + i));
    }

    //allocating a new memory to the new number
    *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
    strcpy(*(newArray + (*size)), number);
    (*size)++;
    //delocating the allocated memories 
    for (int i = 0; i < size; i++)
        free(original[i]);
    free(original);

    return newArray;
}
  1. strlen只返回字符数。 为结尾零*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);空间*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);
  2. 最好使用strncpy而不是strcpy

  3. 你怎么能在newArray *size领先: *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number)); 您只能前进*size -1 ,因为它从零开始。

  4. for循环中,您似乎忘记添加星号* for (int i = 0; i < size; i++)

你释放了太多的原始记忆。

释放内存时查看 for 循环:

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < size; i++)
    free(original[i]);

因为size是一个int *你最终会得到大量的迭代,这将释放比你分配的更多的内存。 要解决此问题,请执行以下操作:

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < *size; i++)
    free(original[i]);

现在您仍然过多地释放了一个元素,因为您在添加新元素时增加了 *size。 释放原始内存的最终版本是

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < *size - 1; i++)
    free(original[i]);

您可以使用 realloc 代替

char** AddingToTheBook(char** original, size_t oldsize, char *number)
{
    char** tmp = realloc(**original, (oldsize  + 1) * sizeof(char *));

    if(tmp)
    {
        tmp[oldsize] = malloc(strlen(number) + 1'
        if(tmp[oldsize])
        {
            strcpy(tmp[oldsize], number);
        }
        else
        {
            /* do something for example realloc back to the old size */
            tmp = NULL;
        }
    }
    return tmp;
}

示例正确用法

    char **tmp = AddingToTheBook(book, size, "Test String")

    if(tmp)
    {
        book = tmp;
        size++;
    }
    else
    {
        /* do something adding to book failed */
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM