在这个问题,有人建议意见,我应该不会投的结果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)
为什么会这样呢?
今天我需要一个简单的算法来检查一个数是否是2的幂.
算法需要是:
ulong价值.我想出了这个简单的算法:
private bool IsPowerOfTwo(ulong number)
{
if (number == 0)
return false;
for (ulong power = 1; power > 0; power = power << 1)
{
// This for loop used shifting for powers of 2, meaning
// that the value will become 0 after the last shift
// (from binary 1000...0000 to 0000...0000) then, the 'for'
// loop will break out.
if (power == number)
return true;
if (power > number)
return false; …Run Code Online (Sandbox Code Playgroud) C++有std :: vector,Java有ArrayList,许多其他语言都有自己的动态分配数组.当动态数组空间不足时,它会重新分配到更大的区域,旧值将被复制到新数组中.这种阵列性能的核心问题是阵列的大小增长速度.如果你总是只能变得足够大以适应当前的推动,那么你每次都会重新分配.因此,将数组大小加倍,或将其乘以1.5倍是有意义的.
有理想的生长因子吗?2倍?1.5倍?理想上,我的意思是数学上合理,最佳平衡性能和浪费的记忆.理论上,我认识到,鉴于您的应用程序可能具有任何可能的推送分布,这在某种程度上取决于应用程序.但我很想知道是否有一个"通常"最好的值,或者在一些严格的约束条件下被认为是最好的.
我听说有一篇关于这个的文章,但我一直都找不到.
从man realloc:realloc()函数返回一个指向新分配的内存的指针,该内存适用于任何类型的变量,可能与ptr不同,如果请求失败则为NULL.
所以在这段代码中:
ptr = (int *) malloc(sizeof(int));
ptr1 = (int *) realloc(ptr, count * sizeof(int));
if(ptr1 == NULL){ //reallocated pointer ptr1
printf("Exiting!!\n");
free(ptr);
exit(0);
}else{
free(ptr); //to deallocate the previous memory block pointed by ptr so as not to leave orphaned blocks of memory when ptr=ptr1 executes and ptr moves on to another block
ptr = ptr1; //deallocation using free has been done assuming that ptr and ptr1 do not point to the same address
}
Run Code Online (Sandbox Code Playgroud)
仅仅假设重新分配的指针指向不同的记忆块而不是同一个块就足够了.因为如果假设变为false并且realloc返回ptr指向的原始内存块的地址然后free(ptr)执行(由于评论中给出的原因)然后内存块将被删除,程序将疯狂.我应该放入另一个条件来比较ptr和ptr1的相等性并排除执行free(ptr)语句吗?
我需要在我正在制作的游戏中拥有一系列结构 - 但我不想将数组限制为固定大小.我被告知有一种方法可以在需要时使用realloc使数组更大,但是找不到任何有用的例子.
有人可以告诉我该怎么做吗?
我有一个记录列表,在开始我不知道记录的数量.我需要将它们读入数组.因此,建议逐个读取所有记录并逐个进行重新分配,然后随着元素的增加继续增加数组大小,或者我应该花一次通过来识别记录数并只执行一次malloc吗?哪一个计算成本会低一些?
我注意到在我们的代码库中的几个地方,我们使用动态扩展数组,即一个与元素计数器和"max elements"值相结合的基本数组.
我想要做的是用通常的数据结构和实用程序函数替换它们,这是出于通常的面向对象的原因.数组元素可以是基本数据类型或结构,我需要快速随机访问元素,最好是类型安全的实现.
所以,基本上,我想使用的是STL向量,但代码库仅限于C89所以我必须提出其他的东西:-)
我给了它一些想法并掀起了这个初稿,只是为了展示我的目标:
/* Type-safe dynamic list in C89 */
#define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t
#define list(type) type##_list_t
#define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size }
#define list_free(list) free(list.base_array)
#define list_set(list, place, element) if ( list.elements < list.max_size ) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if ( list.elements < list.max_size ) { list.base_array[list.elements++] = element; …Run Code Online (Sandbox Code Playgroud) 我有一个主要功能如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i, sum = 0;
char *func_user = argv[1];
// execute func_user function
return 0;
}
void foo1(void)
{
printf("I'm foo1.");
}
void foo2(void)
{
printf("I'm foo2.");
}
void foo3(void)
{
printf("I'm foo3.");
}
Run Code Online (Sandbox Code Playgroud)
我希望用户将他的函数名称作为main的参数,我希望我的程序执行这个给定的函数.有没有办法做这个(比如使用反射)而不使用switch/case方法?
可能重复:
C动态增长的数组
我有一个程序,我需要从文件中读取浮点数.每行是一个浮点数.问题是这个文件可能非常大
float tab[1000];
f = fopen ("data.txt", "r");
i=0;
while (feof(f) == 0) {
fscanf (f, "%f\n", &tab[i]);
i++;
}
Run Code Online (Sandbox Code Playgroud)
如果它太小,我怎么能动态改变数组的大小呢?
我将创建一组结构值.条目的数量取决于输入,因此无法估计数组的长度.
在FOR循环中,解析输入,我会为每次迭代创建一个条目.这意味着我需要重新分配数组,因为大小增加,这导致性能效率低下.
如果我被允许用C++编程,我会使用vector.不幸的是我不能,我想不出更好的主意.
请帮助我,任何建议将不胜感激.
我已在函数内声明并初始化了一个(动态?)数组bool,如下面这个简单示例所示。我正在使用相同的函数来填充它。我不希望在函数执行完成后将数组保留在计算机内存中,以允许在将来的函数调用中使用正确的值重新填充数组。一旦函数调用返回,它会自动从内存中删除吗?如果没有,解决方法是什么?
bool correct_count(int start, int end)
{
int numbers[] = {};
for (int i = 0; i < (end - start + 1); i++)
{
numbers[i] = start + i;
}
if (numbers[0] == start && numbers[end - start] == end)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
在这个简单的示例中,我们可以确定数组的大小,但我尝试编写的程序并非如此。另外,我还不允许在我的程序中使用与内存相关的运算符,例如解引用运算符或动态内存分配,因为这目前超出了我已经学到的范围。