首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >realloc():int数组的下一个大小无效

realloc():int数组的下一个大小无效
EN

Stack Overflow用户
提问于 2022-10-24 15:29:24
回答 1查看 52关注 0票数 0

我试图找出作为参数的整数下的素数。

它的工作方式是,有一个循环,从上一个素数+2开始,再到参数平方下的素数。

正如您所看到的,这是递归的,其中的基本情况是当参数小于6时,它返回1。有一个以{3}开头的素数的全局列表,当找到一个新的素数时会得到更多的内存。

不管怎么说这是密码。我放了一些printfs进行调试。

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int number_of_primes = 1;
int s(int number);
int *primes;
int main(int argc, char *argv[])
{
    primes = (int *)malloc(sizeof(int));
    primes[0] = 3;
    printf("\nNumber of primes under %i is %i\n", atoi(argv[1]), s(atoi(argv[1])) + 1);
    free(primes);
}

int s(int number)
{
    printf("the number is %i\n", number);
    if (number < 5)
    {
        return 1;
    }
    int limit = s((int)sqrt(number)) + 1;
    printf("limit is %i\n", limit);
    // For every odd number after the last prime to number
    for (int odd = primes[limit - 2]; odd < number + 1; odd = odd + 2)
    {
        printf("primes are: ");
        for (int i = 0; i < number_of_primes; i++)
        {
            printf("%i, ", primes[i]);
        }
        printf("\n");
        printf("\ncurrent odd is %i, number is %i, limit is %i\n", odd, number, limit);
        // If it is not a multiple of any of any primes
        for (int prime_index = 0; prime_index < limit; prime_index++)
        {
            printf("prime_index is %i, and primes[prime_index] is %i\n", prime_index, primes[prime_index]);
            if (primes[prime_index])
            {
                if (odd % primes[prime_index] == 0)
                {
                    break;
                }
            }
            if (prime_index == limit - 1)
            {
                printf("new_prime_is %i, number_of_primes is %i, and primes[number_of_primes - 1] is %i\n", odd, number_of_primes, primes[number_of_primes - 1]);
                primes = realloc(primes, sizeof(int));
                primes[number_of_primes] = odd;
                number_of_primes++;
            }
        }
    }
    return number_of_primes;
}

由于某种原因,这在29岁之前是可行的。然后我得到

代码语言:javascript
复制
the number is 29
the number is 5
the number is 2
limit is 2
primes are: 3, 

current odd is 3, number is 5, limit is 2
prime_index is 0, and primes[prime_index] is 3
primes are: 3, 

current odd is 5, number is 5, limit is 2
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 0
new_prime_is 5, number_of_primes is 1, and primes[number_of_primes - 1] is 3
limit is 3
primes are: 3, 5, 

current odd is 5, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
primes are: 3, 5, 

current odd is 7, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 0
new_prime_is 7, number_of_primes is 2, and primes[number_of_primes - 1] is 5
primes are: 3, 5, 7, 

current odd is 9, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
primes are: 3, 5, 7, 

current odd is 11, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 11, number_of_primes is 3, and primes[number_of_primes - 1] is 7
primes are: 3, 5, 7, 11, 

current odd is 13, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 13, number_of_primes is 4, and primes[number_of_primes - 1] is 11
primes are: 3, 5, 7, 11, 13, 

current odd is 15, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
primes are: 3, 5, 7, 11, 13, 

current odd is 17, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 17, number_of_primes is 5, and primes[number_of_primes - 1] is 13
primes are: 3, 5, 7, 11, 13, 17, 

current odd is 19, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 19, number_of_primes is 6, and primes[number_of_primes - 1] is 17
primes are: 3, 5, 7, 11, 13, 17, 19, 

current odd is 21, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
primes are: 3, 5, 7, 11, 13, 17, 19, 

current odd is 23, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 23, number_of_primes is 7, and primes[number_of_primes - 1] is 19
primes are: 3, 5, 7, 11, 13, 17, 19, 23, 

current odd is 25, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
primes are: 3, 5, 7, 11, 13, 17, 19, 23, 

current odd is 27, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
primes are: 3, 5, 7, 11, 13, 17, 19, 23, 

current odd is 29, number is 29, limit is 3
prime_index is 0, and primes[prime_index] is 3
prime_index is 1, and primes[prime_index] is 5
prime_index is 2, and primes[prime_index] is 7
new_prime_is 29, number_of_primes is 8, and primes[number_of_primes - 1] is 23
realloc(): invalid next size
Aborted (core dumped)

当我运行英勇时,我会得到一堆无效的读物。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 15:39:35

你的内存管理错了。

两者均:

代码语言:javascript
复制
primes = (int *)malloc(sizeof(int));
/* and */
primes = realloc(primes, sizeof(int));

只为一个整数分配内存。在分配的内存之外访问分配的对象,它是一个UB (未定义的行为),它通过显示错误来显示自己。

要分配(或为size整数分配内存),您需要:

代码语言:javascript
复制
primes = malloc(size * sizeof(*primes));
/* and */
int *tmp = realloc(primes, size * sizeof(*primes));
if(tmp) primes = tmp;
else {/* memory allocation error handling*/ }

使用sizeof中的对象而不是类型

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74183465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档