繁体   English   中英

C - 在 function 中使用 memcpy 分配值而不是返回

[英]C - using memcpy in function to assign value instead of return

尝试了解 C 中的 arrays 是如何工作的,以及 C 是如何工作的。 我想做一个 function 返回一个 2 元素数组并将该数组分配给一个变量。 首先我做到了;

int make_array(int i) {
   int out[2] = {i, i + 1};
   return (int) *out;}

int main(void) {
    int arr[2] = { make_array(68) }; // should be {68, 69}
    for (int i = 0; i < 2; i++) {
        printf("%d, ", arr[i]);}
    return 0;

>> 68, 0,

这是我能找到的唯一一种在不引发错误的情况下编写它的方法,它是 output 68, 0,而不是 68, 69,。 所以我尝试了这个;

void make_another_array(int j, void *vp) {
   int out[2] = {j, j + 1};
   memcpy(vp, &out, sizeof(int) * 2);}

int main(void) {
   int *hotdog_water = malloc(sizeof(int) * 2);
   make_another_array(68, hotdog_water);
   for (int i = 0; i < 2; i++){
       printf("%d, ", hotdog_water[i]);}
   free(hotdog_water); hotdog_water = NULL;
   return 0;}

function 将结果保存在某处而不是返回它。 最终结果似乎按照我想要的方式工作,但不从 function 返回的东西中分配值似乎很麻烦。 我确信有更好的方法来做这个特定的事情,但是这样做有什么根本错误吗? 如果我写一个指针指向所有东西的地方而不是使用返回,我会遇到什么问题? 是否有任何用于复制结果而不是返回结果的用例?

在调用例程提供的空间中返回数据是正常且常见的。 标准 C 库包括几个示例,例如:

  • scanf("%d%d", &a, &b)将值存储在ab中。
  • frexp(float x, &e)返回一个值并将另一个值存储在e中。
  • fread(array, size, number, stream)array中提供number值。

如果您确实希望通过函数返回值机制提供两个值,则可以使用以下结构来实现:

struct foo { int v[2]; } make_array(int i)
{
    return (struct foo) {{ i, i+1 }};
}

#include <stdio.h>

int main(void)
{
    struct foo x = make_array(68);
    for (int i = 0; i < 2; ++i)
        printf("%d, ", x.v[i]);
    printf("\n");
}

对于大型结构,C 实现通常实现返回机制,正如您使用指针所建议的那样: C 代码看起来像 function 代码中的结构体,调用例程的指针提供结构体,它作为 function 的参数。 返回时,function 使用该指针填充返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM