【问题标题】:Why my C program stops running in the middle?为什么我的 C 程序中途停止运行?
【发布时间】:2020-10-28 03:06:28
【问题描述】:

我正在尝试使用动态编程方法计算最小硬币面额,但我的代码在第二次查询后停止运行,即使如果我提供 T = 10 它应该运行 10 次。为什么它会停止?

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

int min(int x, int y)
{
    return (x < y) ? x : y;
}

short int min_denom(short int N)
{
    short int *table, i, j, x;
    table = (short int*)malloc(N * sizeof(short int));
    for(i = 0; i < N; i++)  
        table[i] = 1 + i;
    for(i = 1; i <= (short int)sqrt(N); i++)    
        for(j = 0; j < N; j++)      
            if(j == i)
                table[j] = min(1, table[j]);
            else if(j > i)
                table[j] = min(table[j - i - 1] + 1, table[j]);         
    x = table[N - 1];
    free(table);
    return x;               
}

int main()
{
    short int T, N, i;
    scanf("%d", &T);
    for(i = 1; i < T; i++)
    {
        scanf("%d", &N);
        printf("%d\n", min_denom((short int)N));        
    }
    scanf("%d", &N);
    printf("%d\n", min_denom((short int)N));
         
    return 0;
}

输出是:

10
100
10
500
22

然后自动停止运行。

【问题讨论】:

  • 为什么你使用short int而不是int?这个MCU有KB内存吗?如果没有 - 你有大量的内存。
  • 您应该使用"%hd" 而不是"%d" for short int`。
  • @i486 我只是想让我的程序使用更少的内存,就是这样!
  • 如果指定%d,scanf() 会将一个四字节整数存储在一个两字节短整型变量中。剩下的两个字节将破坏堆栈上的下一个变量。
  • @ThomasJager 是的,它成功了!非常感谢!

标签: c memory dynamic-memory-allocation


【解决方案1】:

如果我们将“%d”替换为“%hd”或“%hi”,代码将一直运行到最后。原因是因为我们接受的输入将存储在一个短整型变量中,所以我们必须为此使用正确的访问说明符。

更改部分如下所示。

 short int T, N, i;
 scanf("%hi", &T);
 for(i = 1; i < T; i++)
 {
     scanf("%hi", &N);
     printf("%hi\n", min_denom((short int)N));        
 }
 scanf("%hi", &N);
 printf("%hi\n", min_denom((short int)N));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多