我有一个返回指针的函数,我正在计算给定数字的阶乘。
这是我无法改变的骨架代码
#include<stdio.h>
#include<string.h>
//Read only region start
char* factorial (int input1)
{
//Read only region end
//Write code here
char fact=1;
while(input1!=0)
{
fact = fact * input1;
input1--;
}
return fact;
}
我写的代码是:
我也尝试了这段代码
main()
左边说问题,右边是我写的代码。 它抛出的错误是“分段错误”
程序不需要node {
// define the secrets and the env variables
def secrets = [
[$class: 'VaultSecret', path: 'secret/testing', secretValues: [
[$class: 'VaultSecretValue', envVar: 'testing', vaultKey: 'value_one'],
[$class: 'VaultSecretValue', envVar: 'testing_again', vaultKey: 'value_two']]],
[$class: 'VaultSecret', path: 'secret/another_test', secretValues: [
[$class: 'VaultSecretValue', envVar: 'another_test', vaultKey: 'value']]]
]
// optional configuration, if you do not provide this the next higher configuration
// (e.g. folder or global) will be used
def configuration = [$class: 'VaultConfiguration',
vaultUrl: 'http://my-very-other-vault-url.com',
vaultCredentialId: 'my-vault-cred-id']
// inside this block your credentials will be available as env variables
wrap([$class: 'VaultBuildWrapper', configuration: configuration, vaultSecrets: secrets]) {
sh 'echo $testing'
sh 'echo $testing_again'
sh 'echo $another_test'
}
}
函数导致mettl在后端使用的东西来调用函数并评估结果。
答案 0 :(得分:2)
我修改了你的代码,这是它的正确版本:
unsigned int factorial (int input1)
{
unsigned int res = 1;
while(input1 > 1) {
res = res * input1;
input1--;
}
return res;
}
您的错误是返回指针(char *)
而不是简单的char(单字节值)。
我还将char
更改为unsigned int
。为什么呢?
unsigned
:因为您似乎希望自己的结果是积极的,否则您的input1--
循环不会起作用。因此,unsigned允许您在达到数据类型限制之前拥有更大的结果集(有符号字符的最大值为127,无符号字符的最大值为255)。
int
:因为在幕后(在汇编代码中),传递到堆栈和CPU寄存器的数据大小是一个int。 ASM指令告诉只使用寄存器的一个字节(4或8字节之间,取决于x32或x64)。但是使用字节而不是int无任何性能提升。那么为什么不使用int,如果它可以覆盖更大的结果集? : - )
我也停止了&gt; 1条件,因为再运行一次迭代来进行x1
乘法是没用的。这是一个真正的badass优化... 笑话; - ))
<强>更新强>
根据您的评论,您无法更改函数定义,因此通过将结果作为字符串(char *
)返回,此代码将起作用:
char* factorial (int input1)
{
unsigned int res = 1;
char *str;
while(input1 > 1) {
res = res * input1;
input1--;
}
str = malloc(32);
sprintf(str, "%u", res);
return str;
}
请注意,它会分配一个缓冲区来存储结果(即使在64位上,32也应该可以......)。您可能希望在使用后free()
缓冲区以避免内存泄漏。