如何在C语言中返回指针

时间:2017-08-08 13:02:02

标签: c

我有一个返回指针的函数,我正在计算给定数字的阶乘。

这是我无法改变的骨架代码

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

}

我写的代码是:

enter image description here

我也尝试了这段代码

main()

左边说问题,右边是我写的代码。 它抛出的错误是“分段错误

enter image description here

程序不需要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在后端使用的东西来调用函数并评估结果。

1 个答案:

答案 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。为什么呢?

  1. unsigned:因为您似乎希望自己的结果是积极的,否则您的input1--循环不会起作用。因此,unsigned允许您在达到数据类型限制之前拥有更大的结果集(有符号字符的最大值为127,无符号字符的最大值为255)。

  2. int:因为在幕后(在汇编代码中),传递到堆栈和CPU寄存器的数据大小是一个int。 ASM指令告诉只使用寄存器的一个字节(4或8字节之间,取决于x32或x64)。但是使用字节而不是int无任何性能提升。那么为什么不使用int,如果它可以覆盖更大的结果集? : - )

  3. 我也停止了&gt; 1条件,因为再运行一次迭代来进行x1乘法是没用的。这是一个真正的badass优化... 笑话; - ))

  4. <强>更新

    根据您的评论,您无法更改函数定义,因此通过将结果作为字符串(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()缓冲区以避免内存泄漏。