![](/img/trans.png)
[英]Data Structures: My program crashes when I try to pop my data out of the stack
[英]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;
}
strlen
只返回字符数。 为结尾零*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);
空间*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);
最好使用strncpy
而不是strcpy
你怎么能在newArray
*size
领先: *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
您只能前进*size -1
,因为它从零开始。
在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.