C 数组问题在不同平台上显示不同的结果

C Array probelm showing different result on different platforms

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

Return 一个长度为 n 的布尔数组结果,其中 result[i] 为真,如果在给第 i 个孩子所有额外的糖果后,他们将拥有所有孩子中最多的糖果,或者否则为假。

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

输入: candies = [12,1,12], extraCandies = 10 输出:[真,假,真]

对于上面的问题陈述,我在下面写了这个函数:-

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;
}

如果我 运行 在 visual studio 我的 PC 中使用此功能然后我调试器 window 我可以看到 tempcandie 保持预期结果但如果我 运行ning在一个特定的编码平台上它显示不同的结果可能是什么问题

Visual Basic 调试器 window :-

平台输出:-

我无法弄清楚为什么我的输出有差异

您创建了一个整数数组

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

但 return 指向数组第一个元素的指针,类型为 _Boolbool 是类型 _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

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

#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];