在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
我有一个程序读取游戏中实体的"原始"列表,我打算创建一个数组,其中包含一个不确定数量的实体的索引号(int),用于处理各种事物.我想避免使用太多的内存或CPU来保存这些索引......
到目前为止,我使用的一个快速而肮脏的解决方案是在主处理函数(本地焦点)中声明具有最大游戏实体大小的数组,以及另一个整数来跟踪已添加到列表中的数量.这并不令人满意,因为每个列表都拥有3000多个阵列,这并不是那么多,但感觉就像是浪费,因为我可以使用6-7列表的解决方案来实现不同的功能.
我没有找到任何C(不是C++或C#)特定的解决方案来实现这一目标.我可以使用指针,但我有点害怕使用它们(除非它是唯一可能的方式).
数组不会离开本地函数作用域(它们将被传递给函数,然后被丢弃),以防更改内容.
如果指针是唯一的解决方案,我如何跟踪它们以避免泄漏?
我有一个这样的结构:
typedef struct TEXT {
char *text;
struct TEXT *next;
} TEXT;
Run Code Online (Sandbox Code Playgroud)
在某些功能中我有类似的东西:
TEXT *line = (TEXT *) malloc(sizeof(TEXT));
line->text = NULL; // was "\0" before
char current = getchar();
while (current != '\n') {
AddChar(&(line->text), current); // Was AddChar(line->text, current);
current = getchar();
}
Run Code Online (Sandbox Code Playgroud)
AddChar 函数是这样的:
void AddChar(char **text, char c) { //was char *text
*text = (char *) realloc(*text, strlen(*text)+2); //was text = ...
char char_array[2] = {c, '\0');
strcat(*text, char_array); //was strcat(text, char_array);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,程序崩溃了。
据我了解,事实证明 strlen …
realloc可以返回相同的输入地址或不同的地址.如果它返回一个不同的地址,那么它将在内部解除分配/释放输入内存并将该内容移动到另一个位置并返回该新地址.
请考虑以下情况.
new_ptr = realloc (2000, 10000) // Lets assume the input address is 2000
// Lets assume the new_ptr address is 3000
Run Code Online (Sandbox Code Playgroud)
因此,内部realloc将释放指针指向2000的内存并将这些数据移动到新位置3000并返回3000地址.
现在地址2000指向无效.因此,reallocAPI 未将其分配给NULL .
现在,将该无效地址传递给realloc函数.实时可能存在realloc可能获得无效输入地址的更改.
new_ptr = realloc(2000, 10000)
Run Code Online (Sandbox Code Playgroud)
此2000地址无效,因为它已被前一个释放realloc.现在程序崩溃了.
我可以通过以下方式解决此问题.
if (new_ptr != old_ptr ) {
old_ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
由于old_ptr无效.我将它分配给NULL.请确认我的更正.