每当我尝试移开旧内存时,我的程序就会崩溃

时间:2019-01-19 17:50:35

标签: c

所以基本上有一个函数可以分配新的指针内存,当我尝试移开旧的指针时,程序基本上会崩溃my code

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

3 个答案:

答案 0 :(得分:0)

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

  3. 如何在*sizenewArray前进: *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number)); 您只能向前*size -1,因为它从零开始。

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

答案 1 :(得分:0)

您释放了太多的原始内存。

释放内存时查看for循环:

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

由于sizeint *,因此您将获得大量迭代,这将释放比您分配的更多的内存。要解决此问题,请执行以下操作:

(*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]);

答案 2 :(得分:0)

您可以改用realloc

setProgressViewOffset

示例正确用法

setProgressViewOffset (boolean scale, int start, int end)