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 指向数组第一个元素的指针,类型为 _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
永远不要使用指针来双关类型。
#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];
问题陈述:- 有 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 指向数组第一个元素的指针,类型为 _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
永远不要使用指针来双关类型。
#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];