【问题标题】:C Array probelm showing different result on different platformsC 数组问题在不同平台上显示不同的结果
【发布时间】:2021-10-01 15:42:14
【问题描述】:

问题陈述:- 有 n 个孩子拿着糖果。给您一个整数数组 candies,其中每个 candies[i] 代表第 i 个孩子拥有的糖果数量,以及一个整数 extraCandies,表示您拥有的额外糖果数量。

返回一个长度为 n 的布尔数组结果,如果在给第 i 个孩子所有 extraCandies 后,他们将拥有所有孩子中最多的糖果,则 result[i] 为 true,否则为 false。

请注意,多个孩子可以拥有最多数量的糖果。

输入:candies = [12,1,12], extraCandies = 10 输出:[true,false,true]

对于上述问题陈述,我正在编写以下函数:-

bool* kidsWithCandies(int* candies, int candiesSize, int extraCandies, int* returnSize) {
    *returnSize = candiesSize;
    //  printf("%d ", *returnSize);
    int *tempcandie = (int*)malloc(sizeof(int)*candiesSize);
    int it1 = 0, it2, temp = 0;
    bool result;
    for (it1;it1 < candiesSize;it1++)
    {
        result = 1;
        tempcandie[it1] = candies[it1] + extraCandies;
        for (it2 = 0;it2 < candiesSize;it2++)
        {
            if (tempcandie[it1] <= candies[it2])
            {
                result = 0;
                break;
            }
        }

        tempcandie[it1] = result;


    }
    return (bool*)tempcandie;
}

如果我在我的 PC 中的 Visual Studio 中运行此功能,那么我在调试器窗口中可以看到 tempcandie 保持预期的结果,但如果我在一个特定的编码平台上运行它显示不同的结果可能是什么问题

Visual Basic 调试器窗口:-

平台输出:-

我无法弄清楚为什么我的输出有所不同

【问题讨论】:

  • return (bool*)tempcandie; int 不是 bool。如果你想从一个int 数组中创建一个bool 数组,分配一个bool 数组,复制值,释放int 数组并返回bool 数组。
  • 您有没有想过将int * 转换为bool * 可能是个问题?作为一般规则,您应该避免尝试进行指针强制转换。您正在做的事情不需要它们,而且您会引入错误。
  • 我建议使用 C 编译器而不是 C++ 编译器。
  • @KamilCuk:感谢您的输入。但即使我返回 int 数组,值 0 也只会被视为 false。我的理解正确吗?
  • 首先修复您的指针错误。 那么看看还有没有问题。

标签: arrays c return boolean return-type


【解决方案1】:

你创建了一个整数数组

int *tempcandie = (int*)malloc(sizeof(int)*candiesSize)

但返回指向数组第一个元素的指针,其类型为_Bool(bool 是_Bool 类型的别名)。 int 类型和_Bool 类型的对象可以有不同的大小。这就是输出不正确的原因。

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    printf( "sizeof( int ) = %zu\n", sizeof( int ) );
    printf( "sizeof( _Bool ) = %zu\n", sizeof( _Bool ) );
    
    return 0;
}

程序输出可能看起来像

sizeof( int ) = 4
sizeof( _Bool ) = 1

这个函数参数int* returnSize也是多余的。第一个参数应该有限定符const。

该函数可以通过以下方式定义,如下面的演示程序所示。

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

bool * kidsWithCandies( const int *candies, size_t candiesSize, int extraCandies )
{
    bool *result = NULL;
    
    if ( candiesSize )
    {
        result = malloc( candiesSize * sizeof( bool ) );
    
        if ( result )
        {
            size_t max = 0;
        
            for ( size_t i = 1; i < candiesSize; i++ )
            {
                if ( candies[max] < candies[i] ) max = i;
            }
            
            for ( size_t i = 0; i < candiesSize; i++ )
            {
                result[i] = candies[max] - candies[i] < extraCandies;
            }
        }           
    }
    
    return result;
}

int main(void) 
{
    int candies[] = { 12, 1, 12 };
    const size_t N = sizeof( candies ) / sizeof( *candies );
    
    int extraCandies = 10;
    
    
    bool *result = kidsWithCandies( candies, N, extraCandies );
    
    if ( result )
    {
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%s ", result[i] ? "true" : "false" );
        }
        
        putchar( '\n' );
    }
    
    free( result );
    
    return 0;
}

程序输出是

true false true

【讨论】:

  • @Shujaul Hind 查看我的附加帖子。
  • 精湛的解释确实帮助了来自莫斯科的@Valad
【解决方案2】:

永远不要使用指针来对类型进行双关。

#include <stdbool.h>
#include <stdio.h>

int main(void) {
    printf("%zu, %zu\r\n", sizeof(bool), sizeof(int));
}

结果是1,4。 VS19 结果:

你需要

 int *tempcandie = malloc(sizeof(*tempcandie)*candiesSize);
 bool *result = malloc(sizeof(*result)*candiesSize);

 /* ... */

  for(int i = 0; i < candiesize; i++) result[i] = !!tempcandie[i];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2018-07-19
    • 2023-03-07
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多