首页 > 解决方案 > 我在分配内存和使用它时找不到逻辑错误

问题描述

我正在学习 C 中的内存。我正在尝试将质数保存在指针 prime_numers 中。但它没有用。很抱歉,因为我的英语水平太短,我无法解释更多。请帮助这个苦苦挣扎的学生。

#include <stdio.h>
#include <stdlib.h>

int Modulation(unsigned int);

int main()
{
    int *prime_numbers;
    int a = 1;
    prime_numbers = &a;
    int count = 2;
    int p_count = 1;

    int num = 10;

    while(count<=num)
    {
        if(Modulation(count) == 1)
        {
            prime_numbers = malloc(sizeof(int));
            printf("this is count %d\n", count);
            printf("this is prime_numbers + p_count %d\n", prime_numbers+p_count);
            printf("this is p_count %d\n\n", p_count);
            *(prime_numbers+p_count) = count;
            p_count += 1;
        }
        count += 1;
    }

    for(int i=0 ; i<p_count ; i++)
    {
        printf("%d ", *(prime_numbers+i));
    }
    printf("\n\nThis is p_count %d", p_count);
    free(prime_numbers);
    return 0;
}

int Modulation(unsigned int num)
{
    unsigned int count = 2;
    while(count < num)
    {
        if(num%count == 0)
        {
            return 0;
        }
        count += 1;
    }
    return 1;
}

标签: c

解决方案


您只分配一个元素。您可以使用realloc发光先前分配的数组。

也使用%d打印指针将调用未定义的行为。要通过 打印指针printf(),您应该将指针转换为void*并使用%p.

修复代码(省略错误检查):

#include <stdio.h>
#include <stdlib.h>

int Modulation(unsigned int);

int main()
{
    int *prime_numbers = malloc(sizeof(int));
    int a = 1;
    prime_numbers[0] = a;
    int count = 2;
    int p_count = 1;

    int num = 10;

    while(count<=num)
    {
        if(Modulation(count) == 1)
        {
            prime_numbers = realloc(prime_numbers, sizeof(int) * (p_count + 1));
            printf("this is count %d\n", count);
            printf("this is prime_numbers + p_count %p\n", (void*)(prime_numbers+p_count));
            printf("this is p_count %d\n\n", p_count);
            *(prime_numbers+p_count) = count;
            p_count += 1;
        }
        count += 1;
    }

    for(int i=0 ; i<p_count ; i++)
    {
        printf("%d ", *(prime_numbers+i));
    }
    printf("\n\nThis is p_count %d", p_count);
    free(prime_numbers);
    return 0;
}

int Modulation(unsigned int num)
{
    unsigned int count = 2;
    while(count < num)
    {
        if(num%count == 0)
        {
            return 0;
        }
        count += 1;
    }
    return 1;
}

我只修复了未定义的行为,但您的代码还有另一个逻辑错误:1is in the array prime_numbers,但1is not a prime number


推荐阅读